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

9 浏览
0 Comments

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

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

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

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

0
0 Comments

问题的出现原因是想找到与System.out::println等效的lambda表达式。System.out::println是一个方法引用,它首先评估System.out,然后创建等效的lambda表达式,该表达式"捕获"了评估后的值。通常,可以使用o -> System.out.println(o)来实现与方法引用相同的效果,但是每次调用该方法时,这个lambda表达式都会重新评估System.out。

要获得一个精确等效的lambda表达式,可以使用以下代码:

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

这种方法在某人在其间调用了System.setOut(...)时会产生差异。

我理解方法引用的调用目标在第一次遇到其声明时进行评估是有道理的。但是是否有JLS的一部分明确说明了这一点(我确实试过找到它...)。如果调用目标是一个方法,那么可以捕获该方法和this,而不是方法返回的实际对象...就我所理解的而言。或者我完全搞错了?

算了... "首先,如果方法引用表达式以ExpressionName或Primary开头,则将评估该子表达式"。

0
0 Comments

问题的出现原因是希望找到System.out::println的等效lambda表达式。System.out::println是一个方法引用,用于将println方法作为参数传递给其他方法。lambda表达式是一种更简洁的方式来传递函数式接口的实现。

解决方法是使用lambda表达式来代替System.out::println。根据给定的代码,等效的lambda表达式是numbers.forEach(i -> {System.out.println(i);});或更简单的numbers.forEach(i -> System.out.println(i));。在这两种情况下,lambda表达式将传递给forEach方法作为参数,并在每个元素上执行System.out.println(i)操作。

通过使用lambda表达式,可以更简洁地传递方法的实现,并在需要时灵活地更改实现。这种方式可以提高代码的可读性和可维护性。

0