一、distinct()方法介绍
在Java 8中,Stream接口是一个完全支持函数式编程风格的接口。在Stream中,distinct()方法可以实现对流中元素的去重,返回一个保证元素唯一的新流。
distinct()方法使用时需要注意以下几点:
- 元素需实现equals()和hashCode()方法,否则去重不生效
- 对于流中具有null值的元素,需要使用Objects.hashCode()进行判定
二、使用场景
Stream().distinct()方法适用于需要从数据集中获得唯一元素的场景,例如:
- 从数据库查询结果中获取不同的值
- 从文件读取中获取不同的单词或行
- 对列表中的元素进行去重
三、实现方法
下面是一个简单的使用stream().distinct()方法对列表元素进行去重的例子:
List numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 5, 6); List distinctNumbers = numbers.stream().distinct().collect(Collectors.toList()); System.out.println(distinctNumbers);
输出结果:
[1, 2, 3, 4, 5, 6]
可以看出,去重后的列表中只剩下了不同的元素。
四、元素去重的实现原理
Stream().distinct()方法的去重原理是:
- 在元素流中,对每个元素进行hashCode()方法的计算
- 将不同hashCode的元素加入新的HashSet集合中。
- 返回加入HashSet集合的新元素流
五、重写equals()和hashCode()方法
对于一个类的对象如果想要使用distinct()去重,则要求该类的对象需要重写equals()和hashCode()方法。
下面是一个例子:
class Person {
private Integer id;
private String name;
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(id, person.id) &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
List personList = Arrays.asList(
new Person(1, "Tom"),
new Person(2, "Jerry"),
new Person(3, "Tom")
);
List distinctPersons = personList.stream().distinct().collect(Collectors.toList());
System.out.println(distinctPersons);
输出结果:
[Person(id=1, name=Tom), Person(id=2, name=Jerry)]
可以看出,使用distinct()方法后,列表中重复的”Tom”被成功去除,只保留了不同的元素。
六、使用forEach()方法输出流中所有元素
Stream().distinct()方法返回一个保证元素唯一的新流,如果想要检查去重后的流中是否包含某个元素,可以使用forEach()方法遍历整个流,并输出所有遍历到的元素。
下面是一个例子:
List numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 5, 6); List distinctNumbers = numbers.stream().distinct().collect(Collectors.toList()); distinctNumbers.forEach(System.out::println);
输出结果:
1 2 3 4 5 6
七、小结
在Java 8中,Stream接口支持函数式编程风格,提供了distinct()方法用于对流中元素进行去重。使用distinct()方法需要注意重写equals()和hashCode()方法,可以用于从数据集中获得唯一元素的场景。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/246895.html
微信扫一扫
支付宝扫一扫