为什么抽象类不能通过利用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の新機能は何ですか?
翻译于 4年前
2人顶
顶 翻译得不错哦!
java.util.function
パッケージの概要: java.util.function
Comparator と Runnable の初期の証明として、JDK で既に定義されているインターフェイスは、たまたま関数インターフェイスとしてラムダ式と互換性があります。同様に、独自のコードで関数インターフェイスやサードパーティ ライブラリを定義できます。
しかし、広範囲かつ普遍的な、以前の JD カードには存在しなかった特定の形式の関数インターフェイスがあります。多数のインターフェースが新しい java.util.function パッケージに追加されました。その一部を次に示します:
Function -T を入力として、R を出力として返します
Predicate -T を入力として、ブール値を出力として返します
Consumer
Supplier - 入力として T を返し、出力として 1 つの T を返します。 「reduce」操作
これらの最も原始的な機能も存在します。これらは int、long、double として提供されます。例:
IntConsumer - int を入力として受け取り、何らかのアクションを実行し、戻り値はありません
PMを待っています
4年前に翻訳2
Peopleのトップ
トップ
良い翻訳です!
1
この記事のみのすべての翻訳学習とコミュニケーションを目的として、転載する際には必ず翻訳者、出典、およびこの記事へのリンクを明記してください
私たちの翻訳作業はCC規約に準拠しています。私たちの翻訳作業があなたの権利を侵害している場合は、すぐにご連絡ください
コメント (85
以上がJava8の新機能は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。