System.out::println 的等效 lambda 表达式是什么

What is the equivalent lambda expression for System.out::println

我偶然发现了以下 Java 代码,它使用了 System.out.println 的方法参考:

class SomeClass {
    public static void main(String[] args) {
           List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
           numbers.forEach(System.out::println);
        }
    }
}

System.out::println 的等效 lambda 表达式是什么?

是:

numbers.forEach(i -> {System.out.println(i);});

或更简单:

numbers.forEach(i -> System.out.println(i));

方法引用 System.out::println 将首先计算 System.out,然后创建一个 lambda 表达式的等效项,该表达式 捕获 计算值。通常,您会使用
o -> System.out.println(o) 来实现与方法引用相同的效果,但此 lambda 表达式将在每次调用该方法时计算 System.out

所以 确切的 等价物是:

PrintStream p = Objects.requireNonNull(System.out);
numbers.forEach(o -> p.println(o));

如果有人在中间调用 System.setOut(…);,这将有所不同。