【发布时间】:2015-01-04 21:14:57
【问题描述】:
我是singleOrEmpty 流操作符的忠实粉丝。它不在标准库中,但我发现它非常有用。如果流只有一个值,它会在 Optional 中返回该值。如果它没有值或多个值,则返回Optional.empty()。
Optional<Int> value = someList.stream().{singleOrEmpty}
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()
etc.
I asked a question about it earlier 和 @ThomasJungblut came up with this great implementation:
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 机制放在流转换序列的结束?
【问题讨论】:
-
我认为这在 Java 8 中是不可能的,这里有类似的故事 (stackoverflow.com/questions/22308823/extending-listt-in-java-8)
标签: java java-8 java-stream spliterator