壓縮Java集合

壓縮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 幾種集合壓縮方法實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章