我非常喜欢singleOrEmpty
这个流操作符。虽然它不在标准库中,但我觉得它非常有用。如果一个流只有一个值,它会返回一个包含该值的Optional
。如果它没有值或有多个值,它会返回Optional.empty()
。
Optional<Int> value = someList.stream().{singleOrEmpty}
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()
etc.
我之前问过一个关于这个问题的问题,@ThomasJungblut提供了这个很棒的实现:
public static <T> Optional<T> singleOrEmpty(Stream<T> stream) {
return stream.limit(2)
.map(Optional::ofNullable)
.reduce(Optional.empty(),
(a, b) -> a.isPresent() ^ b.isPresent() ? b : Optional.empty());
}
唯一的问题是,您必须将其放在调用的开头。
singleOrEmpty(someList.stream().filter(...).map(...))
而不是在最后一个位置顺序执行
someList.stream().filter().map().singleOrEmpty()
相比于其他流处理机制,这使得阅读变得更加困难。
那么作为新手在流处理方面,有没有人有什么技巧来实现在一系列的流转换末尾添加一个短路singleOrEmpty
机制?