gpt4 book ai didi

Java 8 Spliterator(或类似的)返回一个值,前提是只有一个值

转载 作者:搜寻专家 更新时间:2023-10-31 19:54:49 24 4
gpt4 key购买 nike

我是 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机制流转换?

最佳答案

它不会像使用 limit(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]

就其值(value)而言,除非这真的是性能关键代码,否则我个人更喜欢不太聪明但更清晰的实现

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

关于Java 8 Spliterator(或类似的)返回一个值,前提是只有一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com