返回
使用Stream流操作List集合去除重复对象的重复属性
后端
2023-12-25 16:02:34
日常开发中,我们可能会遇到这样一种情况,需要对数据库查询出来的数据进行一个二次处理,从而达到我们需要的数据结构。
输出结果
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()
等。