Java 可选评估副作用

标签 java lambda

我在计算 Java 可选值时遇到了一些麻烦。考虑以下测试:

@Test
public void test() {
    System.out.println("GOT STRING: " + first().orElse(second()));
}

private Optional<String> first() {
    System.out.println("Evaluating first");
    return Optional.of("STRING OPTIONAL");
}

private String second() {
    System.out.println("Evaluating second");
    return "SECOND STRING";
}

我的期望是,由于 first() 返回一个非空可选,因此不会评估第二个。但实际上输出是:

Evaluating first
Evaluating second
GOT STRING: STRING OPTIONAL

在测试中尝试 orElse 中使用的函数:

@Test
public void test2() {
    System.out.println("GOT STRING: " + (first() != null ? "FIRST IS NOT NULL" : second()));
}

输出:

Evaluating first
GOT STRING: FIRST IS NOT NULL

为什么要评估第二个选项?这似乎很糟糕?

最佳答案

它被评估,因为你是按值传递 second() 的值,而不是仅仅传递对函数本身的引用。您需要执行以下操作之一

System.out.println("GOT STRING: " + first().orElseGet(() ->second()));
System.out.println("GOT STRING: " + first().orElseGet(this::second));

将评估延迟到真正需要的时候。

关于Java 可选评估副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36861514/

相关文章:

java - 偶数行打印菱形

c# - 如果没有找到/计算数据,方法应该返回 nil 还是空数组?

java - 使用 jackson 对具有抽象字段的对象进行序列化和反序列化

java - 简洁流语法 - 处理用户输入

c# - 按时间顺序获取最新 x 条目的最佳方式

c# - 在执行之前传递 lambda 表达式的方法参数类型

java - 通过 Websphere over SSL 连接到 Oracle 的 RSA premaster secret 错误

java - 无法在账单程序中打印报表

c# - C# 编译器或 JIT 能否优化掉 lambda 表达式中的方法调用?

Python Tkinter : Bind function to list of variables in a for-loop