stream流去重

在Java中,使用Stream API进行流去重可以通过以下几种方法实现:

  1. distinct() 方法
  • 默认情况下,distinct() 方法会根据对象的 hashCode()equals() 方法来判断元素是否重复。

  • 如果自定义类需要去重,需要重写 equals()hashCode() 方法。

  1. collectingAndThen() 方法
  • 可以结合使用 collectingAndThen()TreeSet 来去重,TreeSet 会根据自然顺序或者自定义的比较器来排序元素,从而达到去重的效果。
  1. filter() 方法
  • 可以定义一个 Predicate 函数,使用 Set 记录已经出现过的元素,然后过滤掉重复的元素。
  1. 自定义比较器
  • 可以使用 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进行去重操作。请根据具体需求选择合适的方法

Top