Перейти к основному содержимому

Архивирование коллекций в Java

· 2 мин. чтения

1. Введение

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

Операция « zip» немного отличается от стандартных «concat» или «merge» . В то время как операции «concat» или «merge» просто добавляют новую коллекцию в конец существующей коллекции, операция « zip» берет элемент из каждой коллекции и объединяет их.

Основная библиотека не поддерживает « zip» неявно, но, безусловно, есть сторонние библиотеки, которые поддерживают эту полезную операцию.

Рассмотрим два списка, один из которых содержит имена людей, а другой — их возраст.

List<String> names = new ArrayList<>(Arrays.asList("John", "Jane", "Jack", "Dennis"));

List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));

После сжатия мы получаем пары «имя-возраст», созданные из соответствующих элементов из этих двух коллекций.

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

Используя ядро Java, мы могли бы генерировать индексы с помощью IntStream, а затем использовать их для извлечения соответствующих элементов из двух коллекций:

IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
// ...

3. Использование потоков гуавы

Начиная с версии 21, Google Guava предоставляет вспомогательный метод zip в классе Streams . Это устраняет всю возню с созданием и отображением индексов и сводит синтаксис к вводу и операциям:

Streams
.zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
// ...

4. Использование jOOλ (jOOL)

jOOL также предоставляет несколько интересных дополнений по сравнению с Java 8 Lambda, а благодаря поддержке Tuple1 и Tuple16 операция zip становится намного интереснее:

Seq
.of("John","Jane", "Dennis")
.zip(Seq.of(24,25,27));

Это приведет к результату Seq , содержащему кортежи заархивированных элементов:

(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))

Zip-метод jOOL дает гибкость для обеспечения пользовательской функции преобразования:

Seq
.of(1, 2, 3)
.zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);

или, если кто-то хочет заархивировать только с индексом, он может использовать метод zipWithIndex , предоставляемый jOOL:

Seq.of("a", "b", "c").zipWithIndex();

5. Вывод

В этом кратком руководстве мы рассмотрели, как выполнить операцию zip .

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