В этом кратком руководстве мы рассмотрим различные способы объединения коллекций в Java.
Мы рассмотрим различные подходы с использованием Java и внешних фреймворков, таких как Guava, Apache и т. Д. Для ознакомления с коллекциями взгляните на эту серию здесь .
2. Внешние Библиотеки для Работы С Коллекциями
Наряду с собственными подходами мы также будем использовать внешние библиотеки. Пожалуйста, добавьте следующие зависимости в pom.xml :
В этом методе вместе с объектами массива мы также указываем позицию, из которой нам нужно скопировать, а также передаем параметр length.
Это нативное решение Java, поэтому оно не требует никаких внешних библиотек.
3.2. Использование Java 8 Stream API
Потоки предлагают эффективный способ итерации по нескольким различным типам коллекций. Чтобы начать работу с потоками, перейдите к учебнику Java 8 Stream API Tutorial .
Чтобы объединить массивы с помощью Stream , мы можем использовать этот код:
Поток.конкат() создает конкатенированный поток, в котором за элементами первого потока следуют элементы второго потока, который после этого преобразуется в массив с помощью toArray() метод.
Процесс создания потока одинаков для разных типов коллекций. Однако мы можем собирать его различными способами, чтобы извлечь из него различные структуры данных.
Мы вернемся к этому методу в разделах 4.2. и 5.2., чтобы увидеть, как мы можем использовать тот же метод в Списках и Наборах .
3.3. Использование ArrayUtils из Apache Commons
Библиотека Apache commons предоставляет нам метод addAll() из пакета ArrayUtils . Мы можем предоставить массив назначения и исходный массив в качестве параметров, и этот метод вернет комбинированный массив:
Он может использоваться с различными типами данных и принимает два исходных массива вместе с литералом класса для возврата объединенного массива.
4. Объединение списка в Java
4.1. Использование Собственного Метода addAll() коллекции
Сам интерфейс Collection предоставляет нам метод addAll () , который добавляет все элементы из указанной коллекции в вызывающий объект. Это также подробно обсуждается в статье this Baeldung:
List
Поскольку этот метод предусмотрен в самом родительском интерфейсе фреймворка Collections, то есть в интерфейсе Collection , он может быть применен ко всем List s и Set s.
4.2. Использование Java 8
Мы можем использовать Stream и Collectors следующим образом для объединения Списков :
List
Это то же самое, что мы сделали в случае Arrays в разделе 3.2, но вместо преобразования его в массив мы использовали коллекторы для преобразования его в список. Чтобы узнать подробнее о Collectors , посетите Guide to Java 8’s Collectors .
Мы также можем использовать плоские карты таким образом:
List
Во – первых, мы используемStream.of (), который возвращает последовательный поток из двух списков –firstиsecond. Затем мы передадим его вflatMap, который вернет содержимое отображенного потока после применения функции отображения. Этот метод также обсуждается в статье Слияние потоков в Java .
Чтобы узнать больше о flatMap , перейдите к этой статье Baeldung .
4.3. Использование ListUtils из Apache Commons
CollectionUtils.union выполняет объединение двух коллекций и возвращает коллекцию, содержащую все элементы:
List
Этот метод также обсуждается в Руководстве по Apache Commons Collections CollectionUtils . Для получения дополнительной информации перейдите в раздел 4.9. настоящей статьи.
4.4. Использование Гуавы
Чтобы объединитьСписокс помощью Guava, мы будем использоватьIterable, который состоит из методаconcat (). После объединения всех коллекций мы можем быстро получить объединенный объект List , как показано в этом примере:
Set combined = new HashSet<>();
combined.addAll(first);
combined.addAll(second);
5.2. Использование Потоков Java 8
Здесь может быть применена та же функция, которую мы использовали для объектов List :
Set combined = Stream
.concat(first.stream(), second.stream())
.collect(Collectors.toSet());
Единственное заметное отличие здесь при сравнении со списком заключается в том, что вместо использования Коллекционеры.тоЛист() , мы используем Коллекционеры.() накопить все элементы из поставляемых двух потоков в новый Набор .
И подобно Спискам , при использовании плоских карт на Наборах это будет выглядеть так:
Set combined = Stream.of(first, second)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
5.3. Использование Apache Commons
Аналогично List Until , мы также можем работать с SetUtils , который выполняет объединение элементов Set :
Set combined = SetUtils.union(first, second);
5.4. Использование из Гуавы
Библиотека Guava предоставляет нам простой метод Sets.union() для объединения Sets в Java:
Set combined = Sets.union(first, second);
6. Объединение карт в Java
6.1. Простое Java-Решение
Мы можем использовать интерфейс Map , который сам предоставляет нам метод putAll () , который копирует все сопоставления из предоставленного аргумента объекта Map вызывающему объекту Map :
Map combined = new HashMap<>();
combined.putAll(first);
combined.putAll(second);
6.2. Использование Java 8
Начиная с Java 8, классMapсостоит из методаmerge (), который принимает ключ, значение ибифункцию. Мы можем использовать это с помощью оператора Java 8 forEach для достижения функциональности слияния:
Третий параметр, то есть функция переназначения, полезен, когда в обеих исходных картах присутствует одна и та же пара ключ-значение. Эта функция определяет, что следует делать с этими типами значений.
Мы можем использовать ImmutableMap , предоставленную библиотекой Guava Google. Это метод putAll() связывает все ключи и значения данной карты со встроенной картой: