方式一
1. distinct()不提供按照屬性對對象列表進行去重的直接實現。它是基於hashCode()和equals()工作的。如果我們想要按照對象的屬性,對對象列表進行去重,我們可以通過其它方法來實現
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Map<Object,Boolean> seen = new ConcurrentHashMap<>(); return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; }
2. 使用方法:用Stream接口的 filter()接收為參數
List<Entity> lists = list.stream().filter(distinctByKey(b->b.getTid())).collect(Collectors.toList());
方式二
存在重復數據的問題,這里使用stream流的衍生功能,去除一個對象中的部分元素的重復如下:
ArrayList<ProductProcessDrawbackDto> collect = records1.stream().collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>( Comparator.comparing( ProductProcessDrawbackDto::getId))), ArrayList::new));
其中records1是處理的對象,改對象的list集合,collect是處理后返回的結果
其中的ProductProcessDrawbackDto是處理的list中每一個對象,id是判斷是否重復的條件(去除id相同的重復元素,只保留一條)
多個字段或者多個條件去重
ArrayList<PatentDto> collect1 = patentDtoList.stream().collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>( Comparator.comparing(p->p.getPatentName() + ";" + p.getLevel()))), ArrayList::new)