为什么抽象类不能通过利用lambda实例化
抽象类,哪怕只声明了一个抽象方法,也不能使用lambda来实例化。
下面有两个类 Ordering 和 CacheLoader的例子,都带有一个抽象方法,摘自于Guava 库。那岂不是很高兴能够声明它们的实例,像这样使用lambda表达式?
Ordering order = (a, b) -> ...;
CacheLoader<String, String> loader = (key) -> ...;
登入後複製
登入後複製
这样做引发的最常见的争论就是会增加阅读lambda的难度。以这种方式实例化一段抽象类将导致隐藏代码的执行:抽象类的构造方法。
另一个原因是,它抛出了lambda表达式可能的优化。在未来,它可能是这种情况,lambda表达式都不会计算到对象实例。放任用户用lambda来声明抽象类将妨碍像这样的优化。
此外,有一个简单地解决方法。事实上,上述两个摘自Guava 库的实例类已经证明了这种方法。增加工厂方法将lambda转换成实例。
Ordering<String> order = Ordering.from((a, b) -> ...);
CacheLoader<String, String> loader = CacheLoader.from((key) -> ...);
登入後複製
登入後複製
要深入阅读,请参看由 Brian Goetz所做的说明: response to "Allow lambdas to implement abstract classes"。
![Java8有哪些新的特性 Java8有哪些新的特性](https://img.php.cn/upload/article/000/000/001/b13ad5171592ead42b9b5c04af98da25-1.jpg)
Java8有哪些新的特性
翻译于 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的方式提供。例如:
這裡存在著效能上的一些原因,主要釋在輸入或輸出的時候避免裝箱和拆箱操作。
![Java8有哪些新的特性 Java8有哪些新的特性](https://img.php.cn/upload/article/000/000/001/e45035ada03f60faeee63fd051ccff2c-2.jpg)
Java8有哪些新的特性
#翻譯於4年前
##2
2#人頂
頂
翻譯得不錯!
#2
#########本文中的所有譯本僅用於學習和溝通目的,轉載請務必註明文章譯者、出處、和本文連結# #####我們的翻譯工作遵照 CC 協議,如果我們的工作有侵犯到您的權益,請及時聯繫我們##################評論(## #85###)###### ########## #######
以上是Java8有哪些新的特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!