Java 8 过滤列表中的重复对象

Java 8 filter duplicate objects in a list

我有一个 ArrayList:

List<EmpData> data;

class Emp {

    Integer id;
    String department;
    String action;

    // getters and setters
}

我得到的数据如下:

1, Food, Add
1, Food, Remove
2, Food, Add
2, Auto, Remove
3, Electric, Add
3, Electric, Remove
3, Food, Remove

我想删除所有 ID 和部门相同的记录。

那是 For EmpId 1 there & department food, 有 2 条记录所以删除它们。

这样生成的列表将只包含:

2, Food, Add
2, Auto, Remove
3, Food, Remove

如何在 java 8 中过滤此列表?

嗯,你可以排序,然后删除所有后续的:

var sorted = list.stream().sort(Comparator.comparing(EmpData::getId).thenComparing(EmpData::getDepartment)).collect(Collectors.toList());

for(int i = 0; i < sorted.size() - 1; i++){
   var next = sorted.at( i + 1 );
   var current = sorted.at( i );
   if(current.getId().equals(next.getId()) && current.getDepartment().equals(next.getDepartment())){
      sorted.remove(i);
      i--; // check for next element
   }
}
       data.stream().distinct().collect(Collectors.toList());

首先,构建一个 Id/Department 组合存在次数的地图。

然后删除所有计数大于 1 的条目。

例子

List<EmpData> data = List.of();

TreeMap<EmpData, Long> counts = data.stream().collect(Collectors.groupingBy(
        Function.identity(),
        () -> new TreeMap<>(Comparator.comparing(EmpData::getId)
                                  .thenComparing(EmpData::getDepartment)),
        Collectors.counting()));
data.removeIf(e -> counts.get(e) > 1);