返回

使用Stream流操作List集合去除重复对象的重复属性

后端

日常开发中,我们可能会遇到这样一种情况,需要对数据库查询出来的数据进行一个二次处理,从而达到我们需要的数据结构。

输出结果

List<User> users = List.of(
        new User(1, "张三"),
        new User(2, "李四"),
        new User(3, "王五"),
        new User(1, "张三")
);
List<User> distinctUsers = users.stream()
        .distinct()
        .toList();
System.out.println(distinctUsers);

输出结果:

[User{id=1, name='张三'}, User{id=2, name='李四'}, User{id=3, name='王五'}]

原理讲解

Java 8中引入了Stream流操作,它提供了一种简洁高效的方式来处理集合数据。Stream流操作基于惰性求值,即只有在需要时才会执行操作,这可以大大提高处理效率。

在上述代码中,我们使用了distinct()操作来去除重复对象。distinct()操作使用对象的equals()方法来比较对象是否相同。对于自定义对象,如果要使用distinct()操作去除重复对象,需要重写equals()方法来定义对象的相等性。

在我们的示例中,User类没有重写equals()方法,而是使用默认的equals()方法,该方法比较的是对象的引用是否相同。因此,distinct()操作会根据对象的引用来判断是否重复,从而去除了重复的引用。

如果需要根据对象的属性来判断是否重复,则需要重写equals()方法,并根据需要比较的属性来定义对象的相等性。

使用Stream流操作去除重复对象的重复属性的优点:

  • 简洁高效:Stream流操作提供了一种简洁高效的方式来处理集合数据,只需要一行代码就可以完成去除重复对象的操作。
  • 可读性强:Stream流操作的代码可读性强,容易理解和维护。
  • 性能良好:Stream流操作基于惰性求值,只有在需要时才会执行操作,这可以大大提高处理效率。

注意事项:

  • distinct()操作只适用于对象引用或属性值完全相同的情况。
  • 如果需要根据对象的多个属性来判断是否重复,需要重写equals()方法并使用Objects.equals()方法来比较属性值。
  • Stream流操作是惰性求值的,只有在需要时才会执行操作。如果需要立即执行操作,可以使用terminal operation(终结操作),例如toList()forEach()等。