Java 8 Spliterator(或类似的),如果只有一个值,则返回值

我是singleOrEmpty流操作员的singleOrEmpty粉丝。 它不在std lib中,但我发现它非常有用。 如果流只有一个值,则在Optional返回该值。 如果它没有值或多个值,则返回Optional.empty()

 Optional value = someList.stream().{singleOrEmpty} [] -> Optional.empty() [1] -> Optional.of(1) [1, 1] -> Optional.empty() etc. 

我之前问了一个关于它的问题,而@ThomasJungblut 想出了这个伟大的实现 :

 public static  Optional singleOrEmpty(Stream 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机制呢?

它不会像限制(2)那样快,但你可以将它用作list.stream().filter(...).map(...).collect(singleOrEmpty())

 static  Collector> singleOrEmpty() { return Collectors.collectingAndThen( Collectors.mapping( Optional::of, Collectors.reducing((a, b) -> Optional.empty()) ), o -> o.orElseGet(Optional::empty) ); } Stream.empty().collect(singleOrEmpty()); // Optional.empty Stream.of(1).collect(singleOrEmpty()); // Optional[1] Stream.of(1, 1).collect(singleOrEmpty()); // Optional.empty Stream.of(1, 1).skip(1).collect(singleOrEmpty()); // Optional[1] 

对于它的价值,除非这是真正的性能关键代码,否则我个人更喜欢不那么聪明但更清晰的实现

 static Collector> singleOrEmpty() { return Collectors.collectingAndThen( Collectors.toList(), lst -> lst.size() == 1 ? Optional.of(lst.get(0)) : Optional.empty() ); }