新的Java8流框架和friends提供了一些非常简洁的Java代码,但我遇到了一个看似简单的情况,很难做到简洁.
考虑List<Thing> things
和方法Optional<Other> resolve(Thing thing)
.我想把Thing
s映射到Optional<Other>
s,然后得到第一个Other
.显而易见的解决方案是使用things.stream().flatMap(this::resolve).findFirst()
,但flatMap
需要返回一个流,而Optional
没有stream()
方法(或者是Collection
,或者提供一个方法将其转换为Collection
,或者将其视为Collection
).
我能想到的最好结果是:
things.stream()
.map(this::resolve)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
但对于一个非常常见的 case 来说,这似乎太冗长了.有谁有更好的主意吗?