新的 Java 8 流框架和朋友们制作了一些非常简洁的 Java 代码,但我遇到了一个看似简单的情况,但很难做到简洁。
考虑一个 List<Thing> things
和方法 Optional<Other> resolve(Thing thing)
。我想将 Thing
映射到 Optional<Other>
s 并获得第一个 Other
。
The obvious solution would be to use things.stream().flatMap(this::resolve).findFirst()
, but flatMap
requires that you return a stream, and Optional
doesn’t have a stream()
方法(或者它是 Collection
还是提供一种方法将其转换为或将其视为 Collection
)。
我能想到的最好的是:
things.stream()
.map(this::resolve)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
但对于一个看似非常普遍的案例来说,这似乎太冗长了。
有人有更好的主意吗?
原文由 Yona Appletree 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java 9
Optional.stream
已添加到 JDK 9。这使您能够执行以下操作,而无需任何辅助方法:Java 8
是的,这是 API 中的一个小漏洞,因为将
Optional<T>
转换为零或一长度Stream<T>
有点不方便。你可以这样做:但是,在
flatMap
中使用三元运算符有点麻烦,因此最好编写一些辅助函数来执行此操作:在这里,我内联了对
resolve()
的调用,而不是单独的map()
操作,但这是个人喜好问题。