Архивирование коллекций на Java
1. Вступление
В этом руководстве мы покажем, как объединить две коллекции в одну логическую.
The “zip” operation is slightly different from the standard “concat” or “merge”. В то время как операции «concat» или «слияния» просто добавят новую коллекцию в конец существующей коллекции, операция «zip” возьмет элемент из каждой коллекции и объединит их.
Основная библиотека не поддерживает «zip” неявно, но, безусловно, существуют сторонние библиотеки, которые поддерживают эту полезную операцию.
Рассмотрим два списка, один из которых содержит имена людей, а другой содержит их возраст.
List names = new ArrayList<>(Arrays.asList("John", "Jane", "Jack", "Dennis"));
List ages = new ArrayList<>(Arrays.asList(24, 25, 27));
После архивирования мы получаем пары имя-возраст, построенные из соответствующих элементов из этих двух коллекций.
2. Использование Java 8IntStream
Используя ядро Java, мы могли бы сгенерировать индексы с помощьюIntStream, а затем использовать их для извлечения соответствующих элементов из двух коллекций:
IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
// ...
3. Использование потоков гуавы
Google Guava 21 предоставляет вспомогательный метод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, содержащийTuples заархивированных элементов:
(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
МетодjOOL’s zip дает гибкость для предоставления настраиваемой функции преобразования:
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.
Как всегда, примеры кода в статье можно найтиover on GitHub.