java8方法中l(wèi)ist集合去重數(shù)據(jù),一般通過stream的distinct方法。但是distinct不夠靈活,那么該如何解決呢? 1、自定義去重函數(shù) public static <K,T>Predicate<K> distinctPredicate(Function<K,T>function){ ConcurrentHashMap<T,Boolean> map=new ConcurrentHashMap<>(); return t->null == map.putIfAbsent(function.apply(t),true); } 2、應(yīng)用示例 創(chuàng)建實體類 @AllArgsConstructor @Data class Student{ private String name; private Boolean sex; private Integer age; private Double height; private LocalDate birthday; } 創(chuàng)建測試數(shù)據(jù),以名字唯一去掉重復(fù)數(shù)據(jù)。 List<Student> studentList = new ArrayList<>(); // 添加測試數(shù)據(jù),請不要糾結(jié)數(shù)據(jù)的嚴(yán)謹(jǐn)性 studentList.add(new Student("張三", true, 18, 1.75, LocalDate.of(2005, 3, 26))); studentList.add(new Student("李四", false, 16, 1.67, LocalDate.of(2007, 8, 30))); studentList.add(new Student("王五", true, 23, 1.89, LocalDate.of(2000, 1, 16))); studentList.add(new Student("麻六", false, 27, 1.75, LocalDate.of(1996, 9, 20))); studentList.add(new Student("張三", false, 30, 1.93, LocalDate.of(1993, 6, 19))); studentList = studentList.stream().filter(distinctPredicate(Student::getName)).collect(Collectors.toList()); log.info(studentList.toString()); 打印記錄 [Student(name=張三, sex=true, age=18, height=1.75, birthday=2005-03-26), Student(name=李四, sex=false, age=16, height=1.67, birthday=2007-08-30), Student(name=王五, sex=true, age=23, height=1.89, birthday=2000-01-16), Student(name=麻六, sex=false, age=27, height=1.75, birthday=1996-09-20)] |
|