Javaでラムダ式として、フルコンストラクタ呼び出しとメソッドの参照

ニコラス:

私は少し前に遭遇した競争力のある答えラムダの代替として、私にはかなり新しいメソッド参照を使用して、より良い私より。

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で始まる場合、まず、この部分式が評価されます

平易な英語で、一部は前::に評価されることの宣言が最初に遭遇したとき

これが翻訳されるどのようにあなたの仮定は、関数自体のインスタンスの外を生成して、それを使っているようだ、ほとんど正しいです - それが効果的に最終的なものであるため、これは許可されています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=173612&siteId=1