Java中list各种去重(持续完善)

list对象去重:

 Map<String, Person> peopleByName = people.stream()
                .collect(Collectors.toMap(Person::getName, p -> p, (p1, p2) -> p1));

list<Map>去重:根据 Map 中特定字段去重(保留第一个出现的元素)

list.stream()
          .filter(map -> map.containsKey("去重的字段"))
          .collect(Collectors.collectingAndThen(
                 Collectors.toMap(
                         map -> map.get("去重的字段"),
                          map -> map,
                          (existing, replacement) -> existing // 保留首次出现的元素
                 ),
                  map -> new ArrayList<>(map.values()))
            );

list<Map>去重:根据多个字段组合去重(保留最后一个出现的元素)

public static List<Map<String, Object>> test(
            List<Map<String, Object>> list, 
            List<String> compositeKeys) {
        
        return list.stream()
                .filter(map -> compositeKeys.stream().allMatch(map::containsKey))
                .collect(Collectors.collectingAndThen(
                        Collectors.toMap(
                                map -> compositeKeys.stream()
                                        .map(key -> Objects.toString(map.get(key), ""))
                                        .collect(Collectors.joining("|")),
                                map -> map,
                                (oldVal, newVal) -> newVal // 保留最后出现的元素
                        ),
                        map -> new ArrayList<>(map.values()))
                );
    }







 // 测试:根据name+city组合去重(保留最后一个)
        List<Map<String, Object>> result2 = test(dataList, Arrays.asList("name", "city"));
        System.out.println("复合键去重结果:" + result2);

list<Map>去重:基于 TreeSet 的自定义去重(保持顺序)

 public static List<Map<String, Object>> test(
            List<Map<String, Object>> list, 
            String uniqueKey) {
        
        Set<Object> seen = new LinkedHashSet<>();
        return list.stream()
                .filter(map -> 
                    map.containsKey(uniqueKey) && 
                    seen.add(map.get(uniqueKey))
                )
                .collect(Collectors.toList());
    }



  // 测试3:保持顺序的去重
        List<Map<String, Object>> result3 = test(dataList, "id");
        System.out.println("保序去重结果:" + result3);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值