java - Google Guava 可选 - 如何短路多个链式表达式

标签 java java-8 guava

假设我有多个方法,每个方法都返回 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/

相关文章:

java - JPA(和/或 Hibernate)- 如何设置连接和/或查询的超时阈值?

java - 加载 jar 的自定义类加载器在类文件的常量池中提供了非法的 UTF8 字符串

javascript - Selenium Java 注入(inject)新的 Javascript 函数

java - Guava MapMaker 可以选择为工厂方法设置 MaximumSize(0) 吗?

java - Heroku Java Websocket 端点

java - 在 java forEach 循环中获取值时出现问题

Java流将数组收集到一个列表中

java - Java8 中不合逻辑的类型推断

java - 哪个版本的guava兼容java 1.7

java - JUnit 为 com.google.common.collect.Iterables.tryFind 抛出 java.lang.NoSuchMethodError