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

标签 java java-stream collectors

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/

相关文章:

java - anyMatch 和 allMatch

java - 如何连接两个字符串类型列表以形成列表类型的对象?

Java从列表中删除某些属性重复的条目

Java - Jackson反序列化 - 如何反序列化接口(interface)数组?

java - 使用 Google Analytics 跟踪 Java 版本

java - 为通过 Google Cloud Endpoints 公开的 API 方法提供文档

java - 在 findFirst() 之前使用 sorted() 流式传输不再懒惰

Java 8 Stream API——用 Java 8 重写的 Java 9 Collectors.flatMapping

lambda - Java 8 流 api 如何将列表收集到对象

java - 从列表中的对象获取参数