Поиск по сайту:

Функция Java Stream Different() для удаления дубликатов


Метод Java Stream different() возвращает новый поток отдельных элементов. Это полезно для удаления повторяющихся элементов из коллекции перед их обработкой.

Метод Java Stream отличный()

  • Элементы сравниваются с использованием элементов потока, имеющих правильную реализацию метода equals().
  • Если поток упорядочен, порядок встреч сохраняется. Это означает, что элемент, встречающийся первым, будет присутствовать в потоке отдельных элементов.
  • Если поток неупорядочен, результирующие элементы потока могут быть в любом порядке.
  • Stream Different() — это промежуточная операция с отслеживанием состояния.
  • Использование Different() с упорядоченным параллельным потоком может привести к снижению производительности из-за значительных накладных расходов на буферизацию. В этом случае используйте последовательную потоковую обработку.

Удалите дубликаты элементов, используя отдельные()

Давайте посмотрим, как использовать метод stream different() для удаления повторяющихся элементов из коллекции.

jshell> List<Integer> list = List.of(1, 2, 3, 4, 3, 2, 1);
list ==> [1, 2, 3, 4, 3, 2, 1]

jshell> List<Integer> distinctInts = list.stream().distinct().collect(Collectors.toList());
distinctInts ==> [1, 2, 3, 4]

Обработка только уникальных элементов с использованием Stream Different() и forEach()

Поскольку Different() является промежуточной операцией, мы можем использовать с ней метод forEach() для обработки только уникальных элементов.

jshell> List<Integer> list = List.of(1, 2, 3, 4, 3, 2, 1);
list ==> [1, 2, 3, 4, 3, 2, 1]

jshell> list.stream().distinct().forEach(x -> System.out.println("Processing " + x));
Processing 1
Processing 2
Processing 3
Processing 4

Потоковая передача Different() с пользовательскими объектами

Давайте посмотрим на простой пример использования Different() для удаления повторяющихся элементов из списка.

package com.journaldev.java;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class JavaStreamDistinct {

	public static void main(String[] args) {
		List<Data> dataList = new ArrayList<>();
		dataList.add(new Data(10));
		dataList.add(new Data(20));
		dataList.add(new Data(10));
		dataList.add(new Data(20));

		System.out.println("Data List = "+dataList);

		List<Data> uniqueDataList = dataList.stream().distinct().collect(Collectors.toList());

		System.out.println("Unique Data List = "+uniqueDataList);
	}

}

class Data {
	private int id;

	Data(int i) {
		this.setId(i);
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return String.format("Data[%d]", this.id);
	}
}

Выход:

Data List = [Data[10], Data[20], Data[10], Data[20]]
Unique Data List = [Data[10], Data[20], Data[10], Data[20]]

Метод Different() не удалял повторяющиеся элементы. Это потому, что мы не реализовали метод equals() в классе Data. Таким образом, для определения равных элементов использовался метод Object equals() суперкласса. Реализация метода equals() класса Object:

public boolean equals(Object obj) {
    return (this == obj);
}

Поскольку объекты данных имели одинаковые идентификаторы, но ссылались на разные объекты, они считались неравными. Вот почему очень важно реализовать метод equals(), если вы планируете использовать метод Stream Different() с пользовательскими объектами. Обратите внимание, что оба метода equals() и hashCode() используются API классов Collection для проверки равенства двух объектов. Так что лучше предоставить реализацию для них обоих.

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + id;
	return result;
}

@Override
public boolean equals(Object obj) {
	System.out.println("Data equals method");
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Data other = (Data) obj;
	if (id != other.id)
		return false;
	return true;
}

Совет: Вы можете легко сгенерировать методы equals() и hashCode(), используя опцию меню «Eclipse > Source > Generate equals() and hashCode()». После добавления реализации equals() и hashCode() результат будет таким:

Data List = [Data[10], Data[20], Data[10], Data[20]]
Data equals method
Data equals method
Unique Data List = [Data[10], Data[20

Справочник: Документация по API Stream Different()