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(); } }
下一篇:
倒水问题 C/C++实现方法