Java8 list 根据自定义对象多个属性去重复

1. 对象多个属性代码实现:

 List<IcsCheckReport>  resultList = resultListAll.stream().collect(
                    Collectors.collectingAndThen(
                            Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(IcsCheckReport::getChkId)
                                    .thenComparing(IcsCheckReport::getFeatureId)
                                    .thenComparing(IcsCheckReport::getBatchId))), ArrayList::new)
            );

2. 单个对象去重:

 List<IcsCheckReport>  resultList = resultListAll.stream().collect(
                    Collectors.collectingAndThen(
                            Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(IcsCheckReport::getChkId)), ArrayList::new)
            );

3. 其他方式,可以新建一个List,遍历list判断对象属性,add到新list中。

List<IcsCheckReport> icsCheckReports = new ArrayList<>();
        HashMap<String, String> map = new HashMap<>();
        for (IcsCheckReport r1 : icsCheckReports) {
            String key = r1.getChkId() + r1.getFeatureId() + r1.getBatchId();
            if (!map.containsKey(key)) {
                map.put(key, r1.getFeatureId());
                icsCheckReports.add(r1);
            }
        }

4.使用filter过滤

     /**
     *  去重后对象在集合中顺序跟原集合一样
     *  List对象去重,按照对象的某个字段去重,返回去重后新的对象集合
     *  使用方法:用Stream接口的 filter()接收为参数
     * */
    public <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }


/**
 *
 *  调用检查过了
 */
    public void   main(){

        try {
                resultList = resultListAll.stream().filter(distinctByKey(test -> Stream.of(test.getChkId(),test.getFeatureId(),test.getBatchId()).toArray())).collect(Collectors.toList());
          } catch (Exception e) {
                log.error("过滤重复要素ID失败", e);
                e.printStackTrace();
       }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值