java8实现List中对象属性的去重

java8的stream流能完美解对象集合去重问题.
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserCar {
    private Integer id;
    private String carNo;

    public static void main(String[] args) {
        List 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 carList = removeDuplicates4(cars);
        System.out.println(JSONObject.toJSONString(carList));
    }
}    
12345678910111213141516171819
  • 第一种: 不使用java8
    private static List removeDuplicates(List userCars) {
        Set personSet = new TreeSet(Comparator.comparing(UserCar::getCarNo));
        personSet.addAll(userCars);

        return new ArrayList(personSet);
    }		

1234567

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


public TreeSet(Comparator comparator) {
        this(new TreeMap<>(comparator));
    }

12345
  • 第二种: 炫酷的java8写法
    private static List removeDuplicates2(List cars) {
        return cars.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet(Comparator.comparing(UserCar::getCarNo))), ArrayList::new)
        );
    }
12345
  • 第三种: 基于java8 过滤器实现
          private static List removeDuplicates3(List cars) {
        // 用于临时存放id
        List filterCars = new ArrayList<>();

        return cars.stream().filter(
                e -> {
                    boolean found = !filterCars.contains(e.getCarNo());
                    filterCars.add(e.getCarNo());
                    return found;
                }
        ).collect(Collectors.toList());
    }

12345678910111213
  • 第四种: 基于hutool实现

    /**
     * 使用hutool工具类
     * @param cars
     * @return
     */
    private static List removeDuplicates5(List cars) {
        return CollUtil.distinct(cars, UserCar::getCarNo, true);
    }
123456789

你可能感兴趣的:(java,list,windows,数据结构)