【问题标题】:Cascade methods, each returning an Java8 Optional<> [duplicate]级联方法,每个返回一个 Java8 Optional<> [重复]
【发布时间】:2015-09-18 10:46:08
【问题描述】:

我有几个方法,每个都返回一个可选字符串。那我该如何组合,让java调用每个方法,直到找到结果?

我想以这样的方式结束,但没有orElseFlatMap() 方法:

import java.util.Optional;

public class OptionalCascade {

    public static void main(String[] args) {
        Optional<String> result = 

                // try to get a result with method A
                methodA()

                // if method A did not return anything, then try method B
                .orElseFlatMap(methodB());
    }


    static Optional<String> methodA() {
        return Optional.empty();
    }

    static Optional<String> methodB() {
        return Optional.empty();
    }
}

【问题讨论】:

  • 一得到结果就想短路?在这种情况下,您不能只将方法调用放在构造中。您必须将调用包装在 lambda 中(例如使用 orElseGet(() -&gt; methodB()
  • 我会继续使用旧的 if-else 和 null :)

标签: java java-8 optional


【解决方案1】:

假设你想使用标准方法并有单一表达式的解决方案,我只能想出这个:

Optional<String> result = Optional.ofNullable(methodA().orElseGet(
        () -> methodB().orElse(null)));

丑陋。或者,您可以编写自己的静态方法:

public static <T> Optional<T> orElseFlatMap(Optional<T> optional,
        Supplier<Optional<T>> other) {
    return optional.isPresent() ? optional : other.get();
}

Optional<String> result = orElseFlatMap(methodA(), () -> methodB());

【讨论】:

  • 解决方法的好建议 - 但仍然不是我正在寻找的“解决方案”...... :( 无论如何,感谢您的回答。
  • @slartidan,您可能不需要将结果存储为可选项。只需使用String result = methodA().orElseGet(() -&gt; methodB().orElse(whatEver));
  • 我假设 OP 想要以这种方式级联两种以上的方法。这种方法导致嵌套而不是级联语法。
【解决方案2】:

您可以执行Chain-of-responsibility pattern 之类的操作,基本上您只需调用您的第一个方法。然后在你的第一个方法中,如果你可以返回结果然后返回它。如果它是空的,那么调用你的后继方法。

【讨论】:

  • 感谢您的回答。但是,我正在寻找功能语法中的 Java8 解决方案来组合我的选项。我想避免 if/else 等。
猜你喜欢
  • 2013-09-11
  • 2018-03-19
  • 2022-01-06
  • 2018-08-27
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
相关资源
最近更新 更多