Статья

Как в Java из списка удалить дубликаты

В этом кратком руководстве мы узнаем, как удалить повторяющиеся элементы из списка. Сначала мы будем использовать обычную Java, затем Guava и, наконец, решение на основе Java 8 Lambda.

Удаление дубликатов из списка с помощью обычной Java

Мы можем легко удалить повторяющиеся элементы из списка с помощью стандартного фреймворка Java Collections Framework используя Set:
public void removingDuplicatesWithPlainJava() {
    List<Integer> listDuplicates = Lists.newArrayList(7, 0, 3, 1, 2, 3, 0, 7);
    List<Integer> listWithoutDuplicates = new ArrayList<>(
      new HashSet<>(listDuplicates));
      // listWithoutDuplicates содержит уникальные элементы [0, 7, 2, 1, 3]
}
Исходный список остается неизменным.

В приведенном выше примере мы использовали реализацию HashSet, которая представляет собой неупорядоченную коллекцию. В результате порядок очищенного listWithoutDuplicates может отличаться от порядка исходного listDuplicates.
Если нам нужно сохранить начальный порядок элементов, мы можем вместо HashSet использовать LinkedHashSet:
public void removingDuplicatesOrderWithPlainJava() {
    List<Integer> listDuplicates = Lists.newArrayList(7, 0, 3, 1, 2, 3, 0, 7);
    List<Integer> listWithoutDuplicates = new ArrayList<>(
      new LinkedHashSet<>(listDuplicates));
    // listWithoutDuplicates содержит уникальные элементы в порядке исходного списка [7, 0, 3, 1, 2]
}

Удаление дубликатов из списка с помощью библиотеки Guava

public void removingDuplicatesWithGuava() {
    List<Integer> listWithDuplicates = Lists.newArrayList(7, 0, 3, 1, 2, 3, 0, 7);
    List<Integer> listWithoutDuplicates 
      = Lists.newArrayList(Sets.newHashSet(listWithDuplicates));
      
    // listWithoutDuplicates содержит уникальные элементы [3, 0, 7, 1, 2]
}
Здесь также исходный список остается неизменным.

Опять же, порядок элементов в новом списке может быть случайным.
Если мы будем использовать реализацию LinkedHashSet, то сохраним первоначальный порядок:
public void removingDuplicatesPreservingOrderWithGuava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(7, 0, 3, 1, 2, 3, 0, 7);
    List<Integer> listWithoutDuplicates 
      = Lists.newArrayList(Sets.newLinkedHashSet(listWithDuplicates));

    // listWithoutDuplicates содержит уникальные элементы в порядке исходного списка [7, 0, 3, 1, 2]
}

Удаление дубликатов из списка с помощью лямбд Java 8

Наконец, давайте рассмотрим новое решение, использующее лямбды в Java 8. Мы будем использовать метод distinct() из Stream API, который возвращает поток, состоящий из различных элементов, на основе результата, возвращаемого методом equals().

Кроме того, для упорядоченных потоков выбор отдельных элементов является стабильным. Это означает, что для дублированных элементов сохраняется элемент, появляющийся первым в порядке встречаемости:
public void removingDuplicatesWithJava8() {
    List<Integer> listWithDuplicates = Lists.newArrayList(7, 0, 3, 1, 2, 3, 0, 7);
    List<Integer> listWithoutDuplicates = listWithDuplicates.stream()
     .distinct()
     .collect(Collectors.toList());

    // listWithoutDuplicates содержит уникальные элементы в порядке исходного списка [7, 0, 3, 1, 2]
}
Вот и все, мы рассмотрели три быстрых способа удалить все повторяющиеся элементы из списка.
java