Метод distinct
Метод distinct класса Stream удаляет повторяющиеся
элементы из потока и возвращает новый поток, содержащий
только уникальные значения. Метод не принимает параметров.
Уникальность определяется с помощью метода equals
для объектов и сравнения значений для примитивов.
Метод является промежуточной операцией и возвращает новый
поток, поэтому его можно комбинировать с другими операциями
потока, такими как filter, map или collect.
Синтаксис
Stream<T> distinct()
Пример
Давайте создадим поток из списка с повторяющимися элементами и удалим дубликаты:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> numbers = List.of(1, 2, 2, 3, 3, 3, 4, 5, 5);
List<Integer> res = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте применим метод distinct к потоку строк
с повторяющимися значениями:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> strings = List.of("a", "b", "a", "c", "b", "d", "c");
List<String> res = strings.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[a, b, c, d]
Пример
Давайте скомбинируем метод distinct с методом
filter, чтобы сначала удалить дубликаты,
а затем оставить только чётные числа:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> numbers = List.of(1, 2, 2, 3, 4, 4, 5, 6, 6);
List<Integer> res = numbers.stream()
.distinct()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[2, 4, 6]
Пример
Давайте подсчитаем количество уникальных элементов
в потоке с помощью метода distinct
и метода count:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> strings = List.of("abcde", "12345", "abcde", "12345", "abcde");
long res = strings.stream()
.distinct()
.count();
System.out.println(res);
}
}
Результат выполнения кода:
2