[英]Java 8 Spliterator (or similar) that returns a value iff there's only a single value
我是singleOrEmpty
流操作员的singleOrEmpty
粉丝。 它不在std lib中,但我发现它非常有用。 如果流只有一个值,则在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
机制?
它不会像限制(2)那样快,但你可以将它用作list.stream().filter(...).map(...).collect(singleOrEmpty())
static <T> Collector<T, ?, Optional<T>> 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<T> Collector<T,?,Optional<T>> singleOrEmpty() {
return Collectors.collectingAndThen(
Collectors.toList(),
lst -> lst.size() == 1
? Optional.of(lst.get(0))
: Optional.empty()
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.