java - lambda 中的方法是否仅在执行 lambda 时才被评估?

标签 java lambda java-8

我们能否确定在 java lambda 中调用的方法仅在 lambda 本身执行时才被调用,而不是提前被调用?

如果你看看我的代码:

StringBuilder myStringBuilder = new StringBuilder("my result");
Supplier<String> mySupplier = () -> "result: " + myStringBuilder.toString();
myStringBuilder.append(", after appending.");
System.out.println(mySupplied.get());

我们能否 100% 确定结果将永远是:

result: my result, after appending



永远不要只是

result: my result

最佳答案

考虑以下快照:

Runnable runnable = () -> expensiveMethod();  // Runnable not called
firstMethodCall();                            // Runnable not called
secondMethodCall();                           // Runnable not called
runnable.run();                               // HERE IT COMES, Runnable IS called

lambda 表达式只不过是使用一种方法实现匿名类(这确保了 @FunctionalInterface 注释)。
Runnable runnable = new Runnable() {
     void run() {
         expensiveMethod();
     }
};

// runnable's method is not executed since the method run is not called
// the runnable.run() invokes the expensiveMethod()

Java 8 规范 15.27. Lambda Expressions解释当调用函数接口(interface)的适当方法时调用表达式:

Evaluation of a lambda expression produces an instance of a functional interface (§9.8). Lambda expression evaluation does not cause the execution of the expression's body; instead, this may occur at a later time when an appropriate method of the functional interface is invoked.

关于java - lambda 中的方法是否仅在执行 lambda 时才被评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59876934/

相关文章:

java - 在 mssql jdbc 中使用 TLS 1.2

java - java中的自定义转换说明符

java - 准备好的语句不适用于设置角色

java - 不兼容类型 : bad return type in lambda expression?

Java 8 流,为什么要编译第 2 部分……或者什么是方法引用,真的吗?

java - 按照 Eclipse 中的功能接口(interface)生成具有正确签名的方法

java - 如何处理实现 Comparable<?> 而不是 Comparable<E> 的类?

elasticsearch - 用C#编写 bool 和聚合查询

java - 具有多个参数的 Java 8 的 Function.Function

lambda - 如何使用 Java 8 Lambda 表达式检查列表的正确顺序?