通过多个属性将对象内的列表分组:Java 8

Lau*_*eto 5 java drools java-8 spring-boot

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

我正在使用Drools 7.9.0和Java8。我有一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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: [{
           (...)
        }]
    }
]

Run Code Online (Sandbox Code Playgroud)

我需要对Results 列表ocurrences进行分组,以便按id和分组name,就像这样。

预期结果:

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

Run Code Online (Sandbox Code Playgroud)

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

  1. 更改Drools规则,这样我List<Result>就已经可以按我的方式进行结构化了。也许创建一个类与addResult方法检查列表idname和发生添加到右侧的条目。但这并不理想,因为这会增加规则内部的复杂性。
  2. 后处理my,List<Result>以便将occurrencesby id和分组name。但是我不知道如何以优化和简单的方式执行此操作。

做第二个选择的最好方法是什么?