方法引用與Lambda 表達式:探索System.out::println 的等效性
使用System.out 等方法引用時::println,函數首先計算System.out 並捕獲lambda 表達式中的結果值。例如,此方法所引用的lambda 等效項為:
<code class="java">Consumer<Integer> consumer = System.out::println;</code>
此lambda 表達式的行為與以下程式碼類似:
<code class="java">Consumer<Integer> consumer = new Consumer<Integer>() { @Override public void accept(Integer i) { System.out.println(i); } };</code>
但是,方法引用System.out: : println 比lambda 表達式有一個優勢,因為它總是在編譯時計算System.out。對於 lambda 表達式,每次呼叫方法時都會計算 System.out。
為了確保與方法引用完全等效,必須使用以下程式碼:
<code class="java">PrintStream printStream = Objects.requireNonNull(System.out); Consumer<Integer> consumer = o -> printStream.println(o);</code>
這裡,printStream 是一個捕獲System.out 值的變量,保證System.out 的任何後續更改都不會影響該消費者。
以上是方法引用何時不等於 Lambda 表達式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!