假设我有多个方法,每个方法都返回 Optional。我想将它们链接在一起,这样如果其中一个返回一个带有值的 Optional,那么链应该停止传播并且应该在该点停止。例如假设 f1、f2、f3 都返回 Optional。
如果我这样做,
Optional<T> result = f1.or(f2).or(f3);
我看到即使 f2 返回一个 Optional.of(t),f3 仍然被调用。
我希望它表现得像一个短路表达式,但它不会那样工作。
谁能帮我解决这个问题。
最佳答案
您需要使用 Supplier
使其变得懒惰:
Stream.<Supplier<Optional<T>>>of(this::f1, this::f2, this::f3)
.map(Supplier::get)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
示例,与 Mike 的回答相同:
public class LazyOptional {
public static void main(String... args) {
new LazyOptional().run();
}
public void run() {
Stream.<Supplier<Optional<String>>>of(this::f1, this::f2, this::f3)
.map(Supplier::get)
.peek(System.out::println)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
}
public Optional<String> f1() {
return Optional.empty();
}
public Optional<String> f2() {
return Optional.of("a");
}
public Optional<String> f3() {
return Optional.of("b");
}
}
输出:
Optional.empty
Optional[a]
关于java - Google Guava 可选 - 如何短路多个链式表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577138/