方法一:Stream写法
原理: 1.调用集合对象的`stream()` 方法,得到一个 Stream 对象。
2.以元素的 id 作为键,将元素封装成 Map 中的值。
3.通过`values()` 方法获取 Map 中的所有值,构造成新的集合返回。
例子:
public static <T extends HasId> List<T> removeDuplicateById(List<T> list) {
return list.stream()
.collect(Collectors.toMap(T::getId, Function.identity(), (a, b) -> a))
.values()
.stream()
.collect(Collectors.toList());
}
方法二:使用Map去重
原理:1.遍历集合,将元素的 id 和元素本身作为键值对存入 Map 中。
2.由于 Map 中键值对的特性,如果有重复的 id,后面的元素会覆盖前面的元素,这样就完成了去重。
例子:
List<MyClass> list = new ArrayList<>();
list.add(new MyClass(1L, "value1"));
list.add(new MyClass(2L, "value2"));
list.add(new MyClass(1L, "value3"));
list.add(new MyClass(3L, "value4"));
list = removeDuplicateById(list);
System.out.println(list);
// output: [{id=1, property=value1}, {id=2, property=value2}, {id=3, property=value4}]
下面的代码可以自己封装到工具类中
public static <T extends HasId> List<T> removeDuplicateById(List<T> list) {
if (list == null || list.isEmpty()) {
return Collections.emptyList();
}
Map<Long, T> resultMap = new LinkedHashMap<>();
for (T element : list) {
resultMap.put(element.getId(), element);
}
return new ArrayList<>(resultMap.values());
}