gpt4 book ai didi

java - 如何在流分组或分区时忽略对象?

转载 作者:行者123 更新时间:2023-12-05 01:25:14 25 4
gpt4 key购买 nike

Collectors.groupingBy 期间可以忽略某些元素或 Collectors.partitioningBy

我当然知道我可以放置一个 .filter()流中的任何地方。但我的问题是,我必须进行相当复杂且昂贵的评估,以决定我的对象应分为哪个“组”。

此外,在收集过程中,总有很多东西是我想忽略的。

示例:想象一个 List<Foo> ,我想分成 2 个列表。这很简单,但是我怎么能另外忽略所有不符合我的评估条件的对象呢?

var map = foos.stream().collect(Collectors.groupingBy(
foo -> {
int bar = complexEvaluation(foo);
if (bar > 1000) return true;
if (bar < 0) return false;
//TODO how to neglect the rest between 0-1000
},
Collectors.mapping(foo -> foo.id, Collectors.toSet())
));

最佳答案

只需使用 enum 来定义您的 3 种情况:

enum Categories {
HIGH, LOW, NEGATIVE
}

var map = foos.stream().collect(Collectors.groupingBy(
foo -> {
int bar = complexEvaluation(foo);
if (bar > 1000) return HIGH;
if (bar < 0) return NEGATIVE;
return LOW;
},
Collectors.mapping(foo -> foo.id, Collectors.toSet())
));

如果不需要,则忽略或删除 LOW。它还具有为您的类别赋予更多意义而不是仅仅将它们命名为 true/false 的额外好处,并且在您将来需要更多类别时更容易重构.

唯一的缺点是它构建了一个无用的 LOW 集合,但只有当它与其他集合和 complexEvaluation() 操作相比真的很大时,这才是一个问题。

关于java - 如何在流分组或分区时忽略对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70957549/

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