ニコラス:
私は少し前に遭遇した競争力のある答えラムダの代替として、私にはかなり新しいメソッド参照を使用して、より良い私より。
Stream.generate(new AtomicInteger(1)::getAndIncrement)...
私は約Oracleの仕様に見えたメソッドの参照をして定義された4種類があります。
- 静的メソッドへの参照
ContainingClass::staticMethodName
- 特定のオブジェクトのインスタンスメソッドへの参照
containingObject::instanceMethodName
- 特定の型の任意のオブジェクトのインスタンスメソッドへの参照
ContainingType::methodName
- コンストラクタへの参照
ClassName::new
私はこの1つの分類で苦労しています。私はSO上の任意の質問を発見していないか、該当するものがドキュメントで説明しました。これはどのように匿名クラスに変換されますか?
私の疑惑は、次のとおりです。
IntStream.generate(new IntSupplier() {
AtomicInteger atom = new AtomicInteger(1);
@Override
public int getAsInt() {
return atom.getAndIncrement();
}
})....
...私はこれが可能であるかを理解していません。一見、私は式があると思います。
IntStream.generate(new IntSupplier() {
@Override
public int getAsInt() {
return new AtomicInteger(1).getAndIncrement();
}
})....
...まだこれはより他には何もありません() -> new AtomicInteger(1).getAndIncrement()
。
どこ表現のこの種は、定義され、それが正確にラムダ/匿名クラスで書き換えることだろうか?
ユージン:
まあnew AtomicInteger(1)
インスタンスを返すので、それは二番目です。これは、翻訳されたかの正確な詳細は、実装固有のものですが、それが作成された単一のインスタンスだとこれがでバックアップ-EDれJLS 15.13.3
メソッド参照発現がExpressionNameまたはPrimaryで始まる場合、まず、この部分式が評価されます
平易な英語で、一部は前::
に評価されることの宣言が最初に遭遇したとき。
これが翻訳されるどのようにあなたの仮定は、関数自体のインスタンスの外を生成して、それを使っているようだ、ほとんど正しいです - それが効果的に最終的なものであるため、これは許可されています。