メソッド参照とラムダ式: 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 サイトの他の関連記事を参照してください。