java - 按多个属性对对象内的列表进行分组 : Java 8

标签 java spring-boot java-8 drools

如何通过两个对象属性对对象内的列表进行分组?

我正在使用 Drools 7.9.0 和 Java 8。我有一个 Result用作返回每个匹配的 Drools 规则的类。

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
@NoArgsConstructor
public class Result implements Serializable {

    private Integer id;
    private String name;
    private List<Occurrences> occurrences = new ArrayList<>();

    public void addOccurrence(Occurrences occurrence) {
        this.occurrences.add(occurrence);
    }
}

执行 Drools 后,我得到一个 List<Result> .转换为 JSON 后看起来像这样。

当前结果:

[
     {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0002,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Other thing"
        id: 0002,
        occurrences: [{
           (...)
        }]
    }
]

我需要对 Result 列表进行分组所以 ocurrencesid 分组和 name ,像这样。

预期结果:

[
    {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }, {
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0002,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Other thing"
        id: 0002,
        occurrences: [{
           (...)
        }]
    }
]

实现这个的最佳方法是什么?我有两个选择:

  1. 更改 Drools 规则以便我的 List<Result>已经按照我需要的方式构建了。也许用 addResult 创建一个类检查 id 列表的方法和 name并将事件添加到正确的条目中。但这并不理想,因为它会增加规则内部的复杂性。
  2. 后处理我的 List<Result>所以它将 occurrences 分组通过 idname .但我不知道如何以优化和简单的方式做到这一点。

执行第二个选项的最佳方法是什么?

最佳答案

你可以这样做,

Map<String, List<Result>> resultsWithSameIdAndName = results.stream()
    .collect(Collectors.groupingBy(r -> r.getId() + ":" + r.getName()));

List<Result> mergedResults = resultsWithSameIdAndName.entrySet().stream()
    .map(e -> new Result(Integer.valueOf(e.getKey().split(":")[0]), 
        e.getKey().split(":")[1],
        e.getValue().stream().flatMap(r -> r.getOccurrences().stream())
            .collect(Collectors.toList())))
        .collect(Collectors.toList());

关于java - 按多个属性对对象内的列表进行分组 : Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54444651/

相关文章:

java - Payara Micro 忽略 persistence.xml 中的连接 url

java - 将本地时间 (Java 8) 转换为日期

java - 网络请求超时或网络丢失或网络速度慢无法在 codenameone 中正确处理

java - 启动tomcat时传递数据库身份验证详细信息

java - 无法启动 bean 'eurekaAutoServiceRegistration'

java - Spring Boot @MockBeans - 如何在多个测试类中使用相同的 beans

Spring Security 具有不同用户详细信息的多个 HTTPSecurity 服务在 Spring Boot 中不起作用

java-8 - sudo yum install 只安装 JRE 而不是 JDK - Centos

用于 int 范围的 Java 8 IntStream?

java - 在 AWS 上部署 Java Web 应用程序 + MongoDB