【问题标题】:What is the equivalent lambda expression for System.out::printlnSystem.out::println 的等效 lambda 表达式是什么
【发布时间】:2015-03-17 09:12:44
【问题描述】:

我偶然发现了以下 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 表达式是什么?

【问题讨论】:

  • 虽然它的功能并不完全 :-)
  • @StephenC 你能告诉我为什么吗?
  • 好吧println 几乎不是一个无副作用的函数……是吗。

标签: java lambda java-8 method-reference


【解决方案1】:

这是:

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

甚至更简单:

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

【讨论】:

    【解决方案2】:

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

    所以 精确 等价物是:

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

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

    【讨论】:

    • 我知道方法引用的调用目标是评估when its declaration is first encountered,这对我来说是合乎逻辑的。但是有没有明确说明这一点的 jls 部分(我真的试图找到它......)。如果调用目标是一种方法,则可以捕获该方法和 this 例如,而不是该方法返回的实际对象……据我所知。还是我完全搞错了?
    • 没关系...First, if the method reference expression begins with an ExpressionName or a Primary, this subexpression is evaluated
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多