在Java中,使用Stream API进行流去重可以通过以下几种方法实现:
- distinct() 方法
-
默认情况下,
distinct()
方法会根据对象的hashCode()
和equals()
方法来判断元素是否重复。 -
如果自定义类需要去重,需要重写
equals()
和hashCode()
方法。
- collectingAndThen() 方法
- 可以结合使用
collectingAndThen()
和TreeSet
来去重,TreeSet
会根据自然顺序或者自定义的比较器来排序元素,从而达到去重的效果。
- filter() 方法
- 可以定义一个
Predicate
函数,使用Set
记录已经出现过的元素,然后过滤掉重复的元素。
- 自定义比较器
- 可以使用
Comparator
来定义自定义的去重逻辑,比如根据某个属性去重。
下面是一些示例代码:
示例1:使用 distinct()
方法
List<Student> students = Arrays.asList(
new Student("Alice", 20, true),
new Student("Bob", 22, false),
new Student("Alice", 20, true)
);
List<Student> distinctStudents = students.stream()
.distinct()
.collect(Collectors.toList());
distinctStudents.forEach(System.out::println);
示例2:使用 collectingAndThen()
和 TreeSet
List<Student> students = Arrays.asList(
new Student("Alice", 20, true),
new Student("Bob", 22, false),
new Student("Alice", 20, true)
);
List<Student> distinctStudents = students.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))),
ArrayList::new
));
distinctStudents.forEach(System.out::println);
示例3:使用 filter()
方法
List<Student> students = Arrays.asList(
new Student("Alice", 20, true),
new Student("Bob", 22, false),
new Student("Alice", 20, true)
);
Predicate<Student> distinctByKey = keyExtractor -> seen.add(keyExtractor.apply(t));
List<Student> distinctStudents = students.stream()
.filter(distinctByKey.apply(Student::getName))
.collect(Collectors.toList());
distinctStudents.forEach(System.out::println);
以上示例展示了如何使用Java 8 Stream API进行去重操作。请根据具体需求选择合适的方法