1.はじめに

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



  • zip”

    操作は標準の “concat”や “merge”とは少し異なります。 “concat”または “merge”操作は既存のコレクションの最後に新しいコレクションを追加するだけですが、 “__ zip”操作は各コレクションから要素を取り出してそれらを結合します。

コアライブラリは暗黙のうちに “__zip”をサポートしていませんが、確かにこの便利な操作を特徴とするサードパーティのライブラリがあります。

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

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

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

圧縮後、これら2つのコレクションの対応する要素から構成された名前と年齢のペアが表示されます。

2. Java 8の使い方

IntStream

コアJavaを使用して、

IntStream

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

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

3. Guavaストリームを使う

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

を含む

Seq

の結果を生成します。

(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))


jOOLのzip

メソッドは、カスタム変換機能を柔軟に提供します。

Seq
  .of(1, 2, 3)
  .zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);

あるいはインデックスのみでzipしたい場合は、

jOOLが提供する

zipWithIndex__メソッドを使用できます。

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

5.まとめ

このクイックチュートリアルでは、

zip

操作の実行方法を見てきました。

いつものように、この記事のコード例はhttps://github.com/eugenp/tutorials/tree/master/guava-modules/guava-21[GitHubで利用可能]です。