新的Java 8流框架及其朋友可以编写一些非常简洁的Java代码,但我遇到过一个看似简单的情况,但要做到简洁却很棘手。
考虑List<Thing> things
和方法Optional<Other> resolve(Thing thing)
。我想把__abc2映射到Optional<Other>
s,并得到第一个Other
。
显而易见的解决方案是使用things.stream().flatMap(this::resolve).findFirst()
,但flatMap
要求你返回一个流,而Optional
没有stream()
方法(或者它是Collection
或提供一个方法将其转换为或将其视为Collection
)。
我能想到的最好的是:
things.stream()
.map(this::resolve)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
但对于一个很普通的例子来说,这似乎太啰嗦了。
有人有更好的主意吗?