Javaでのコレクションの圧縮
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で利用可能]です。