Java Stream distinct() 方法返回一个新的单独元素流,在处理它们之前,有助于从集合中删除重复元素。
Java Stream 区别() 方法
- 元素是用 equals() 方法进行比较的,所以必须使 stream元素有平等() 方法的正确实施 *如果流被命令,则会遇到的顺序被保留。这意味着第一个发生的元素将存在于不同的元素流中 *如果流被命令,那么结果的流元素可以以任何顺序存在 Stream distinct() 是状态的中间操作 使用分开() 与顺序的平行流可能由于显著的缓冲覆盖而表现不佳。
使用 distinct() 删除重复元素
让我们看看如何使用流区分() 方法从集合中删除重复元素。
1jshell> List<Integer> list = List.of(1, 2, 3, 4, 3, 2, 1);
2list ==> [1, 2, 3, 4, 3, 2, 1]
3
4jshell> List<Integer> distinctInts = list.stream().distinct().collect(Collectors.toList());
5distinctInts ==> [1, 2, 3, 4]
仅使用 Stream distinct() 和 forEach() 处理唯一元素
由于 distinct() 是一个中间操作,所以我们可以使用 forEach() 方法来处理唯一的元素。
1jshell> List<Integer> list = List.of(1, 2, 3, 4, 3, 2, 1);
2list ==> [1, 2, 3, 4, 3, 2, 1]
3
4jshell> list.stream().distinct().forEach(x -> System.out.println("Processing " + x));
5Processing 1
6Processing 2
7Processing 3
8Processing 4
以自定义对象流区别()
让我们来看看一个简单的例子,使用 distinct()从 [列表]( / 社区 / 教程 / java 列表)中删除重复元素。
1package com.journaldev.java;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.stream.Collectors;
6
7public class JavaStreamDistinct {
8
9 public static void main(String[] args) {
10 List<Data> dataList = new ArrayList<>();
11 dataList.add(new Data(10));
12 dataList.add(new Data(20));
13 dataList.add(new Data(10));
14 dataList.add(new Data(20));
15
16 System.out.println("Data List = "+dataList);
17
18 List<Data> uniqueDataList = dataList.stream().distinct().collect(Collectors.toList());
19
20 System.out.println("Unique Data List = "+uniqueDataList);
21 }
22
23}
24
25class Data {
26 private int id;
27
28 Data(int i) {
29 this.setId(i);
30 }
31
32 public int getId() {
33 return id;
34 }
35
36 public void setId(int id) {
37 this.id = id;
38 }
39
40 @Override
41 public String toString() {
42 return String.format("Data[%d]", this.id);
43 }
44}
输出:
1Data List = [Data[10], Data[20], Data[10], Data[20]]
2Unique Data List = [Data[10], Data[20], Data[10], Data[20]]
distinct() 方法没有删除重复元素,这是因为我们没有在数据类中实现 equals() 方法,所以使用 superclass Object equals() 方法来识别等元素。
1public boolean equals(Object obj) {
2 return (this == obj);
3}
由于数据对象具有相同的ID,但它们是指不同的对象,它们被认为不是平等的,这就是为什么如果您计划使用流不同() 方法与自定义对象,执行 equals() 方法非常重要。
1@Override
2public int hashCode() {
3 final int prime = 31;
4 int result = 1;
5 result = prime * result + id;
6 return result;
7}
8
9@Override
10public boolean equals(Object obj) {
11 System.out.println("Data equals method");
12 if (this == obj)
13 return true;
14 if (obj == null)
15 return false;
16 if (getClass() != obj.getClass())
17 return false;
18 Data other = (Data) obj;
19 if (id != other.id)
20 return false;
21 return true;
22}
** 提示**:您可以轻松地使用Eclipse > Source > Generate equals() and hashCode()
菜单选项生成 equals() 和 hashCode() 方法。
1Data List = [Data[10], Data[20], Data[10], Data[20]]
2Data equals method
3Data equals method
4Unique Data List = [Data[10], Data[20
** 引用**: Stream distinct() API Doc