美文网首页
Java8的stream流能完美解对象集合去重问题.

Java8的stream流能完美解对象集合去重问题.

作者: wanggs | 来源:发表于2022-07-18 16:32 被阅读0次

    java8的stream流能完美解对象集合去重问题.

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class UserCar {
        private Integer id;
        private String carNo;
    
        public static void main(String[] args) {
            List<UserCar> cars = new ArrayList<>();
            cars.add(UserCar.builder().id(1).carNo("AA").build());
            cars.add(UserCar.builder().id(2).carNo("AA").build());
            cars.add(UserCar.builder().id(2).carNo("AA").build());
            cars.add(UserCar.builder().id(3).carNo("AB").build());
    
             List<UserCar> carList = removeDuplicates4(cars);
            System.out.println(JSONObject.toJSONString(carList));
        }
    }    
    
    • 第一种: 不使用java8
        private static List<UserCar> removeDuplicates(List<UserCar> userCars) {
            Set<UserCar> personSet = new TreeSet<UserCar>(Comparator.comparing(UserCar::getCarNo));
            personSet.addAll(userCars);
    
            return new ArrayList<UserCar>(personSet);
        }       
    
    

    这也是大多数人第一想到的,借助 TreeSet 去重,其中 TreeSet 的其中一个构造函数接收一个排序的算法,同时这也会用到 TreeSet 的去重策略上.

    
    public TreeSet(Comparator<? super E> comparator) {
            this(new TreeMap<>(comparator));
        }
    
    
    • 第二种: 炫酷的java8写法
        private static List<UserCar> removeDuplicates2(List<UserCar> cars) {
            return cars.stream().collect(Collectors.collectingAndThen(
                    Collectors.toCollection(() -> new TreeSet<UserCar>(Comparator.comparing(UserCar::getCarNo))), ArrayList::new)
            );
        }
    
    • 第三种: 基于java8 过滤器实现
              private static List<UserCar> removeDuplicates3(List<UserCar> cars) {
            // 用于临时存放id
            List<String> filterCars = new ArrayList<>();
    
            return cars.stream().filter(
                    e -> {
                        boolean found = !filterCars.contains(e.getCarNo());
                        filterCars.add(e.getCarNo());
                        return found;
                    }
            ).collect(Collectors.toList());
        }
    
    
    • 第四种: 基于hutool实现
    
        /**
         * 使用hutool工具类
         * @param cars
         * @return
         */
        private static List<UserCar> removeDuplicates5(List<UserCar> cars) {
            return CollUtil.distinct(cars, UserCar::getCarNo, true);
        }
    

    相关文章

      网友评论

          本文标题:Java8的stream流能完美解对象集合去重问题.

          本文链接:https://www.haomeiwen.com/subject/stkcirtx.html