【Java】guavaのライブラリを使ったStreamのmapWithIndex

1 min read読了の目安(約1500字

概要

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