我有两个返回 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 中,我更喜欢从 func1
和 func2
的 Optional
中取出值:
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
太低级了,我很少使用它,只是作为最后的手段。