ホームページ >Java >&#&チュートリアル >メソッド参照がラムダ式と等価ではないのはどのような場合ですか?

メソッド参照がラムダ式と等価ではないのはどのような場合ですか?

DDD
DDDオリジナル
2024-11-04 00:29:30298ブラウズ

When is a Method Reference Not Equivalent to a Lambda Expression?

メソッド参照とラムダ式: System.out::println の等価性の調査

System.out などのメソッド参照を利用する場合::println の場合、関数は最初に System.out を評価し、結果の値をラムダ式でキャプチャします。たとえば、このメソッド参照に相当するラムダは次のようになります。

<code class="java">Consumer<Integer> consumer = System.out::println;</code>

このラムダ式は、次のコードと同様に動作します。

<code class="java">Consumer<Integer> consumer = new Consumer<Integer>() {
    @Override
    public void accept(Integer i) {
        System.out.println(i);
    }
};</code>

ただし、メソッド参照 System.out は次のようになります。 :println は、コンパイル時に常に System.out を評価するため、ラムダ式よりも利点があります。ラムダ式の場合、メソッドが呼び出されるたびに System.out が評価されます。

メソッド参照と正確に同等であることを保証するには、次のコードを使用する必要があります:

<code class="java">PrintStream printStream = Objects.requireNonNull(System.out);
Consumer<Integer> consumer = o -> printStream.println(o);</code>

ここで、printStream は System.out 値をキャプチャする変数であり、System.out に対する後続の変更がこのコンシューマに影響を与えないことを保証します。

以上がメソッド参照がラムダ式と等価ではないのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。