Javaでのコレクションの圧縮

Javaでのコレクションの圧縮

1. 前書き

このチュートリアルでは、2つのコレクションを1つの論理コレクションに圧縮する方法を説明します。

The “zip” operation is slightly different from the standard “concat” or “merge”。 「連結」または「マージ」操作は、既存のコレクションの最後に新しいコレクションを追加するだけですが、「zip”操作は、各コレクションから要素を取得して結合します。

コアライブラリは暗黙的に「zip”」をサポートしていませんが、この便利な操作を備えたサードパーティのライブラリは確かにあります。

2つのリストについて考えます。1つは人の名前を持ち、もう1つは年齢を含みます。

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

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

zip圧縮後、これら2つのコレクションの対応する要素から構築された名前と年齢のペアになります。

2. Java 8IntStreamを使用

コアJavaを使用すると、IntStreamを使用してインデックスを生成し、それらを使用して2つのコレクションから対応する要素を抽出できます。

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

3. グアバストリームの使用

Google Guava 21は、Streamsクラスにzipヘルパーメソッドを提供します。 これにより、インデックスの作成とマッピングの煩わしさがなくなり、入力と操作の構文が削減されます。

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

これにより、Tuplesのzip要素を含むSeqの結果が生成されます。

(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);

または、インデックスのみで圧縮したい場合は、jOOL:が提供するzipWithIndexメソッドを使用できます。

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

5. 結論

このクイックチュートリアルでは、zip操作を実行する方法を確認しました。

いつものように、記事のコード例はover on GitHubにあります。