🍏
【Java】guavaのライブラリを使ったStreamのmapWithIndex
概要
Javaにはguava
と呼ばれる、Googleが作成しているJavaの便利なメソッドが用意されたライブラリがあります。Google製のJava便利ライブラリGuava入門の記事で紹介されているような、Table形式のデータを扱ったり、cacheの仕組みを簡単に実装できたりします。
今回はこのguavaのライブラリにある、mapWithIndex
のメソッドについて紹介します。
Streamのmap関数でのindex取得に関して
JavaのStreamで使用できるmap関数では、indexが直接取得できません。Javaのループ内でインデックス番号を取得する時の考察の記事にあるようにfor文にするとか、Streamっぽい関数を作成するとか、やりようはいくらでもあるのです。
ただ、JavaScriptのmap関数みたいに引数追加したら取得できるくらい、気軽だと嬉しいですよね。そんなライブラリがないか探してみました。ちなみに、JavaScriptのmap関数については【JavaScript】Arrayのmapメソッドは習うより慣れろって感じの記事で解説されています。
guavaのStreamライブラリ
というわけで見つけたライブラリがguavaで、guavaではバージョン21からStreamのメソッドも提供しているようです。New Stream, Comparator and Collector in Guava 21に詳細はまとめられていますが、その中でmapWithIndex
が紹介されています。
mapWithIndexの実装サンプル
上記の記事で紹介されているmapWithIndexの内容のほぼそのままですが、実装サンプルを紹介します。
第一引数にStream化したコレクション(もしくは配列)、第二引数にラムダ式を指定します。
Main.java
package com.sample;
import com.google.common.collect.Streams;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> results = Streams.mapWithIndex(
Arrays.asList("a", "b", "c").stream(),
(str, index) -> str + ":" + index
).collect(Collectors.toList());
results.stream().forEach(r -> {
System.out.println(r);
});
}
}
下記のような結果が出力されます。
a:0
b:1
c:2
Discussion