gpt4 book ai didi

如果只有一个值,Java 8 收集器会返回一个值

转载 作者:IT老高 更新时间:2023-10-28 21:00:38 26 4
gpt4 key购买 nike

我对这个函数式编程和流的东西有点陌生,但我所知道的一点是非常有用的!

这种情况我遇到过好几次了:

List<SomeProperty> distinctProperties = someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.toList());

if (distinctProperties.size() == 1) {
SomeProperty commonProperty = distinctProperties.get(0);
// take some action knowing that all share this common property
}

我真正想要的是:

Optional<SomeProperty> universalCommonProperty = someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.singleOrEmpty());

我认为 singleOrEmpty 除了与 distinct 结合使用之外,在其他情况下也很有用。当我还是一个 uber n00b 时,我花了很多时间重新发明 Java 集合框架,因为我不知道它在那里,所以我尽量不重复我的错误。 Java 是否有一个很好的方法来做这个 singleOrEmpty 事情?我是不是写错了?

谢谢!

编辑:这是 distinct 案例的一些示例数据。如果忽略 map 步骤:

Optional<SomeProperty> universalCommonProperty = someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.singleOrEmpty());

[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.of(1)
[2, 2] -> Optional.of(2)
[1, 2] -> Optional.empty()

当我搞砸我的类型或有遗留代码时,我发现我需要这个。能够快速说出“这个集合的所有元素都共享这个属性,所以现在我可以使用这个共享属性执行一些操作”真是太好了。另一个例子是当用户多选一些不同的元素时,你试图看看你能做什么(如果有的话)对所有元素都有效。

EDIT2:抱歉,如果我的示例具有误导性。关键是singleOrEmpty。我通常发现我在前面放了一个 distinct,但它也可以是其他类型的 filter

Optional<SomeProperty> loneSpecialItem = someList.stream()
.filter(obj -> obj.isSpecial())
.collect(Collectors.singleOrEmpty());

[special] -> Optional.of(special)
[special, special] -> Optional.empty()
[not] -> Optional.empty()
[not, special] -> Optional.of(special)
[not, special, not] -> Optional.of(special)

EDIT3:我认为我通过激励 singleOrEmpty 而不是仅仅要求它自己搞砸了。

Optional<Int> value = someList.stream().collect(Collectors.singleOrEmpty())
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()

最佳答案

这会产生创建集合的开销,但它很简单,即使您忘记先对流进行 distinct() 也能正常工作。

static<T> Collector<T,?,Optional<T>> singleOrEmpty() {
return Collectors.collectingAndThen(
Collectors.toSet(),
set -> set.size() == 1
? set.stream().findAny()
: Optional.empty()
);
}

关于如果只有一个值,Java 8 收集器会返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810375/

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