【发布时间】:2015-05-03 07:39:48
【问题描述】:
我一直在使用新的Optional type in Java 8,并且遇到了一个功能上不支持的看似常见的操作:“orElseOptional”
考虑以下模式:
Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
Optional<Result> resultFromServiceB = serviceB(args);
if (resultFromServiceB.isPresent) return resultFromServiceB;
else return serviceC(args);
}
这种模式有很多种形式,但归根结底是在一个可选项上需要一个“orElse”,它接受一个产生新可选项的函数,只有在当前选项不存在时才调用。
它的实现如下所示:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
我很好奇这样的方法不存在是否有原因,如果我只是以无意的方式使用 Optional,以及人们想出什么其他方法来处理这种情况。
我应该说我认为涉及自定义实用程序类/方法的解决方案并不优雅,因为使用我的代码的人不一定知道它们存在。
另外,如果有人知道,JDK 9 中会包含这样的方法吗?我在哪里可以提出这样的方法?对我来说,这似乎是 API 的一个非常明显的遗漏。
【问题讨论】:
-
See this issue。澄清一下:这已经在 Java 9 中了——如果不是在 Java 8 的未来更新中的话。
-
是的!谢谢,在我的搜索中没有找到。
-
@Obicere 这个问题在这里不适用,因为它是关于空可选的行为,而不是关于替代结果。 Optional 已经有
orElseGet()来满足 OP 的需要,只是它不会生成好的级联语法。 -
很棒的 Java 教程 可选:codeflex.co/java-optional-no-more-nullpointerexception
标签: java lambda java-8 optional java-9