【发布时间】:2022-02-02 14:37:54
【问题描述】:
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())
));
【问题讨论】:
-
如果您不想使用
filter(),您可能需要遍历这些值并应用另一组if语句。 -
如果我理解正确,您不能使用
filter()进行过滤,因为您在分组时需要所述过滤器的逻辑。对吗? -
@JettoMartínez 但这是正确的,因为如果我想在之前应用
filter(),我必须运行complexEvaluation两次。一次用于过滤器忽略 0-1000 的所有内容,一次用于分组/分区。并且该操作太昂贵而无法运行两次(包含数据库调用)。
标签: java java-stream collectors