在 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/