List集合对象根据id去重

方法一: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());
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值