用于删除重复数据的 Java 数据流 distinct() 函数

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]

Java Stream Distinct Example

仅使用 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

Java Stream Distinct ForEach Example

以自定义对象流区别()

让我们来看看一个简单的例子,使用 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

Published At
Categories with 技术
Tagged with
comments powered by Disqus