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

Объединение различных типов коллекций в Java

Изучите различные способы объединения коллекций в Java.

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

1. введение

В этом кратком руководстве мы рассмотрим различные способы объединения коллекций в Java.

Мы рассмотрим различные подходы с использованием Java и внешних фреймворков, таких как Guava, Apache и т. Д. Для ознакомления с коллекциями взгляните на эту серию здесь .

2. Внешние Библиотеки для Работы С Коллекциями

Наряду с собственными подходами мы также будем использовать внешние библиотеки. Пожалуйста, добавьте следующие зависимости в pom.xml :


    org.apache.commons
    commons-collections4
    4.2


    org.apache.commons
    commons-exec
    1.3


    com.google.guava
    guava
    26.0-jre

Последние версии можно найти на Maven Central для Commons , Commons-exec и Guava .

3. Объединение массивов в Java

3.1. Нативное Java-Решение

Java поставляется со встроенным void arraycopy() метод, который копирует данный исходный массив в целевой.

Мы можем использовать его следующим образом:

Object[] combined = new Object[first.length + second.length];
System.arraycopy(first, 0, combined, 0, first.length);
System.arraycopy(second, 0, combined, first.length, second.length);

В этом методе вместе с объектами массива мы также указываем позицию, из которой нам нужно скопировать, а также передаем параметр length.

Это нативное решение Java, поэтому оно не требует никаких внешних библиотек.

3.2. Использование Java 8 Stream API

Потоки предлагают эффективный способ итерации по нескольким различным типам коллекций. Чтобы начать работу с потоками, перейдите к учебнику Java 8 Stream API Tutorial .

Чтобы объединить массивы с помощью Stream , мы можем использовать этот код:

Object[] combined = Stream.concat(Arrays.stream(first), Arrays.stream(second)).toArray();

Поток.конкат() создает конкатенированный поток, в котором за элементами первого потока следуют элементы второго потока, который после этого преобразуется в массив с помощью toArray() метод.

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

Мы вернемся к этому методу в разделах 4.2. и 5.2., чтобы увидеть, как мы можем использовать тот же метод в Списках и Наборах .

3.3. Использование ArrayUtils из Apache Commons

Библиотека Apache commons предоставляет нам метод addAll() из пакета ArrayUtils . Мы можем предоставить массив назначения и исходный массив в качестве параметров, и этот метод вернет комбинированный массив:

Object[] combined = ArrayUtils.addAll(first, second);

Этот метод также подробно обсуждается в статье Обработка массивов с помощью Apache Commons Lang3.

3.4. Использование Гуавы

Guava предоставляет нам метод concat() для той же цели:

Object [] combined = ObjectArrays.concat(first, second, Object.class);

Он может использоваться с различными типами данных и принимает два исходных массива вместе с литералом класса для возврата объединенного массива.

4. Объединение списка в Java

4.1. Использование Собственного Метода addAll() коллекции

Сам интерфейс Collection предоставляет нам метод addAll () , который добавляет все элементы из указанной коллекции в вызывающий объект. Это также подробно обсуждается в статье this Baeldung:

List combined = new ArrayList<>();
combined.addAll(first);
combined.addAll(second);

Поскольку этот метод предусмотрен в самом родительском интерфейсе фреймворка Collections, то есть в интерфейсе Collection , он может быть применен ко всем List s и Set s.

4.2. Использование Java 8

Мы можем использовать Stream и Collectors следующим образом для объединения Списков :

List combined = Stream.concat(first.stream(), second.stream()).collect(Collectors.toList());

Это то же самое, что мы сделали в случае Arrays в разделе 3.2, но вместо преобразования его в массив мы использовали коллекторы для преобразования его в список. Чтобы узнать подробнее о Collectors , посетите Guide to Java 8’s Collectors .

Мы также можем использовать плоские карты таким образом:

List combined = Stream.of(first, second).flatMap(Collection::stream).collect(Collectors.toList());

Во – первых, мы используем Stream.of () , который возвращает последовательный поток из двух списков – first и second . Затем мы передадим его в flatMap , который вернет содержимое отображенного потока после применения функции отображения. Этот метод также обсуждается в статье Слияние потоков в Java .

Чтобы узнать больше о flatMap , перейдите к этой статье Baeldung .

4.3. Использование ListUtils из Apache Commons

CollectionUtils.union выполняет объединение двух коллекций и возвращает коллекцию, содержащую все элементы:

List combined = ListUtils.union(first, second);

Этот метод также обсуждается в Руководстве по Apache Commons Collections CollectionUtils . Для получения дополнительной информации перейдите в раздел 4.9. настоящей статьи.

4.4. Использование Гуавы

Чтобы объединить Список с помощью Guava, мы будем использовать Iterable , который состоит из метода concat () . После объединения всех коллекций мы можем быстро получить объединенный объект List , как показано в этом примере:

Iterable combinedIterables = Iterables
  .unmodifiableIterable(Iterables.concat(first, second));
List combined = Lists.newArrayList(combinedIterables);

5. Комбинирование набора в Java

5.1. Простое Java-Решение

Как мы уже обсуждали в разделе 4.1, интерфейс Collection поставляется со встроенным методом addAll () |, который также может использоваться для копирования Списков и Наборов :

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 для достижения функциональности слияния:

second.forEach((key, value) -> first.merge(key, value, String::concat));

Третий параметр, то есть функция переназначения, полезен, когда в обеих исходных картах присутствует одна и та же пара ключ-значение. Эта функция определяет, что следует делать с этими типами значений.

Мы также можем использовать flatMap вот так:

Map combined = Stream.of(first, second)
  .map(Map::entrySet)
  .flatMap(Collection::stream)
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, String::concat));

6.3. Использование Apache Commons Exec

Apache Commons Exec предоставляет нам простой метод слияния(Map first, Map second) :

Map combined = MapUtils.merge(first, second);

6.4. Использование Google Guava

Мы можем использовать ImmutableMap , предоставленную библиотекой Guava Google. Это метод putAll() связывает все ключи и значения данной карты со встроенной картой:

Map combined = ImmutableMap.builder()
  .putAll(first)
  .putAll(second)
  .build();

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

В этой статье мы рассмотрели различные подходы к объединению различных типов Коллекций . Мы объединили массивы , Списки , Наборы и Карты .

Как всегда, полные фрагменты кода с соответствующими модульными тестами можно найти на GitHub.