有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我有多个方法,每个方法都返回可选的。我想将它们链接在一起,这样,如果其中一个返回一个带有值的可选值,那么链应该停止传播,并且应该在该点停止。e、 假设f1、f2、f3各返回可选

如果我这样做

Optional<T> result = f1.or(f2).or(f3);

我看到,即使f2返回可选值。对于(t),f3仍然会被调用

我希望它的行为像一个短路表达式,但它不是这样工作的

谁能帮我一下吗


共 (2) 个答案

  1. # 1 楼答案

    您需要使用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]
    
  2. # 2 楼答案

    您可以通过在Java8中使用短路流来实现这一点。您可以对结果应用映射,使结果也显示为Optional<T>,而不是Optional<Optional<T>>

    Optional<Integer> e1 = Optional.empty();
    Optional<Integer> e2 = Optional.empty();
    Optional<Integer> p = Optional.of(1337);
    Optional<Integer> e3 = Optional.empty();
    Optional<Integer> e4 = Optional.empty();
    
    // peek used to show output
    Optional<Integer> first = Stream.of(e1, e2, p, e3, e4)
        .peek(System.out::println)
        .filter(Optional::isPresent)
        .map(Optional::get)
        .findFirst();
    

    输出:

    Optional.empty
    Optional.empty
    Optional[1337]