为什么抽象类不能通过利用lambda实例化
抽象类,哪怕只声明了一个抽象方法,也不能使用lambda来实例化。
下面有两个类 Ordering 和 CacheLoader的例子,都带有一个抽象方法,摘自于Guava 库。那岂不是很高兴能够声明它们的实例,像这样使用lambda表达式?
Ordering order = (a, b) -> ...;
CacheLoader<String, String> loader = (key) -> ...;
Salin selepas log masuk
Salin selepas log masuk
这样做引发的最常见的争论就是会增加阅读lambda的难度。以这种方式实例化一段抽象类将导致隐藏代码的执行:抽象类的构造方法。
另一个原因是,它抛出了lambda表达式可能的优化。在未来,它可能是这种情况,lambda表达式都不会计算到对象实例。放任用户用lambda来声明抽象类将妨碍像这样的优化。
此外,有一个简单地解决方法。事实上,上述两个摘自Guava 库的实例类已经证明了这种方法。增加工厂方法将lambda转换成实例。
Ordering<String> order = Ordering.from((a, b) -> ...);
CacheLoader<String, String> loader = CacheLoader.from((key) -> ...);
Salin selepas log masuk
Salin selepas log masuk
要深入阅读,请参看由 Brian Goetz所做的说明: response to "Allow lambdas to implement abstract classes"。
等PM
翻译于 4年前
2人顶
顶 翻译得不错哦!
java.util.function
包概要:java.util.function
作为Comparator 和Runnable早期的证明,在JDK中已经定义的接口恰巧作为函数接口而与lambdas表达式兼容。同样方式可以在你自己的代码中定义任何函数接口或第三方库。
但有特定形式的函数接口,且广泛的,通用的,在之前的JD卡中并不存在。大量的接口被添加到新的java.util.function 包中。下面是其中的一些:
Function -T作为输入,返回的R作为输出
Predicate -T作为输入,返回的boolean值作为输出
Consumer - T作为输入,执行某种动作但没有返回值
Supplier - 没有任何输入,返回T
BinaryOperator -两个T作为输入,返回一个T作为输出,对于“reduce”操作很有用
这些最原始的特征同样存在。他们以int,long和double的方式提供。例如:
这里存在性能上的一些原因,主要释在输入或输出的时候避免装箱和拆箱操作。
等PM
翻译于 4年前
2人顶
顶 翻译得不错哦!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
Atas ialah kandungan terperinci Java8有哪些新的特性. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!