方法引用与 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中文网其他相关文章!