我在计算 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/