壓縮Java集合
本文我們探討如何壓縮兩個集合至一個邏輯集合。壓縮操作與連接或合併稍微有些不同,後者是簡單在原集合後面增加新的集合,壓縮操作從每個集合中取一個元素然後合併它們。默認Java庫沒有提供壓縮功能,但一些第三方庫提供了類似功能。
假如有兩個列表,一個名稱集合,另一個是年齡集合。
List<String> names = new ArrayList<>(Arrays.asList("John", "Jane", "Jack", "Dennis"));
List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));
壓縮之後,我們從兩個列表中得到名稱、年齡對結構。
1. 使用Java8 IntStream
使用Java Api,可以生成IntStream索引然後使用索引從兩個集合中抽取元素:
IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
// ...
2. 使用Guava Stream
Google Guava 的Streams類提供zip工具方法,其消除了創建、映射索引的所有麻煩,並將語法簡化爲輸入和操作:
Streams
.zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
// ...
3. 使用jOOλ (jOOL)
jOOL也爲Java 8 Lambda提供了一些有趣的附加功能,利用Tuple1到Tuple16,壓縮操作變得非常有意思:
Seq
.of("John","Jane", "Dennis")
.zip(Seq.of(24,25,27));
結果生成一個序列,其中包括一系列元祖:
(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
jOOL的壓縮方法也提供了自定義轉換功能:
Seq
.of(1, 2, 3)
.zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);
或者如果希望直接使用索引壓縮,可以使用zipWithIndex 方法:
Seq.of("a", "b", "c").zipWithIndex();
4. 總結
本文介紹了Java 幾種集合壓縮方法實現。