Рубрики
Без рубрики

Пересечение двух списков в Java

Узнайте, как получить пересечение двух списков.

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы узнаем, как получить пересечение двух списков.

Как и многие другие вещи, это стало намного проще благодаря внедрению потоков в Java 8 .

2. Пересечение двух списков струнных

Давайте создадим два Список s Струнные s с некоторым пересечением – оба имеют некоторые дублированные элементы:

List list = Arrays.asList("red", "blue", "blue", "green", "red");
List otherList = Arrays.asList("red", "green", "green", "yellow");

А теперь Мы определим пересечение списков с помощью методов потоковой передачи :

Set result = list.stream()
  .distinct()
  .filter(otherList::contains)
  .collect(Collectors.toSet());

Set commonElements = new HashSet(Arrays.asList("red", "green"));

Assert.assertEquals(commonElements, result);

Во-первых, мы удаляем дублированные элементы различные . Затем мы используем фильтр выбрать элементы, которые также содержатся в otherList .

Наконец, мы конвертируем наш выход с помощью Коллекционные . Пересечение должно содержать каждый общий элемент только один раз. Порядок не должен иметь значения, таким образом, toSet это самый простой выбор, но мы также можем использовать toList или другой метод коллектора.

Для получения более подробной информации просмотрите наше руководство по Java 8’s Collectors.

3. Пересечение списков таможенных классов

Что если наши Список s не содержат Струнные s, а скорее экземпляры пользовательского класса, который мы создали? Ну, пока мы следуем конвенциям Java, решение с методами потоковой передачи будет хорошо работать для нашего пользовательского класса.

Как Содержит метод решает, появляется ли конкретный объект в списке? Основываясь на Равно метод. Таким образом, мы должны переопределить Равно метод и убедитесь, что он сравнивает два объекта на основе значений соответствующих свойств.

Например, два прямоугольника равны, если их ширина и высота равны.

Если мы не перекроем равняется метод, наш класс использует равняется реализации родительского класса. В конце концов, или, вернее, цепочка наследования, Объект классная равняется метод выполняется. Тогда два экземпляра равны только в том случае, если они относятся к точно одному и тому же объекту на куче.

Для получения дополнительной информации о равняется метод, см. нашу статью на Java равняется () и хэш-код () Контракты .

4. Заключение

В этой быстрой статье мы видели, как использовать потоки для расчета пересечения двух списков. Есть много других операций, которые раньше были довольно утомительными, но довольно просты, если мы знаем наш путь вокруг API Java Stream. Взгляните на наши дальнейшие учебники с Java потоков здесь .

Примеры кода доступны более на GitHub .