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

Сжатие коллекций в Java

См.раздел как архивировать коллекции в Java с помощью обычной Java и внешних инструментов.

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

1. введение

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

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

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

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

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

List 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)

joomla также предоставляет некоторые интересные дополнения по сравнению с Java 8 Lambda, и с поддержкой Tuple 1 to 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, он может использовать метод zipWithIndex , предоставленный joomla:

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

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

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

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