java - 如果返回的 Optional 有值,则按原样返回 Optional,否则调用另一个函数

标签 java java-8 option-type flatmap

<分区>

我有两个返回 Optional 的方法 func1 和 func2。 如果从 func1 返回的 Optional 有值,则按原样返回 Optional,否则调用 func2 并返回其 Optional。 一种方法是使用 if-else

Optional<MyObject> opt1 = func1();
if (opt1.isPresent()) {
    return opt1;
}
return func2();

但是,我希望使用 Java 8 Optional 来实现它并避免 if-else

类似于:

return Optional.of(obj1) 
        .flatMap_returnOptionalIfvaluePresent(func1)
        .orElseReturnOptionalFromThis(func2)

谁能推荐一个好的方法?

最佳答案

编辑:

Java 9 及更高版本提供了一个非常优雅的解决方案:

Optional<String> myFunc() {
    return func1().or(this::func2);
}

or(在 Java 9 中引入)完全满足您的要求:如果从 func1 返回的 Optional 有一个值,它是返回(或等效的 Optional)。如果不是,则调用供应商(此处为 func2())以获取 Optional,然后将其返回。

Java 8

有几种方法。在 Java 8 中,我更喜欢从 func1func2Optional 中取出值:

Optional<String> myFunc() {
    String returnValue = func1().orElse(func2().orElse(null));
    return Optional.ofNullable(returnValue);
}

编辑 2:@Holger 在评论中的替代建议足以在答案中引用(Holger,您可能只是因为问题已关闭而将其作为评论发布,因此您不能发表你自己的答案):

    return func1().map(Optional::of).orElse(func2());

它以相反的方式进行:使用 Optional::of 的映射将 func1 中的 Optional 包装在 Optional< 中 仅当它有一个值时,或Else 再次从中解包它。

如果对 func2 的调用开销很大,您可能希望在不需要时避免调用它(当 func1 提供值时):

    String returnValue = func1().orElseGet(() -> func2().orElse(null));

或者在 Holger 的版本中:

    return func1().map(Optional::of).orElseGet(this::func2);
其他几个答案中使用的

isPresent 太低级了,我很少使用它,只是作为最后的手段。

关于java - 如果返回的 Optional 有值,则按原样返回 Optional,否则调用另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54251250/

相关文章:

ios - Swift 可选值,展开

java - 如何在java中读取文本文件并将行分配给变量

java - 在 Java 中使用 BigInteger 的递归斐波那契数列

java - 我们从 java 列表中获取所需输出的效率如何?

java - 将 map 列表转换为使用 ImmutablePair 和 Java 8 流的 map

swift - Swift 枚举中的默认初始化被忽略

java - 隐藏基于 if 语句动态添加的按钮

java - 无法转换为 JSONArray 以在 ListView 中显示

java-8 - 如何按组递增

c++ - 在 C++ 中,使用模板根据状态更改函数调用的行为