StreamAPIについて調べてみた flatMap編 その1

【前提条件】

[環境]

【概要】

今回はflatMapについて調べてみました。

flatMapはStream内の要素を受け取りStreamを返すメソッドです。
Collectionの中にネストしたCollectionがある場合になどに使えます。

【データ用のクラス】

flatMapを使う前にサンプル用のデータを作ります。
SalesクラスににはIntegerのListを持たせます。

import java.util.ArrayList;
import java.util.List;

public class Sales {

    public final List<Integer> priceList = new ArrayList<>();

    public void add(final int price) {

        priceList.add(price);
    }
}

【flatMapを使ってみる】

今回は全てのSalesのpriceListの合計を計算するサンプルを作成します。

[Salesのデータ作成用メソッド]
    private static List<Sales> createData() {

        final List<Sales> list = new ArrayList<>();

        final Sales sales1 = new Sales();
        sales1.add(100);
        sales1.add(150);
        sales1.add(200);
        list.add(sales1); // total : 450

        final Sales sales2 = new Sales();
        sales2.add(250);
        sales2.add(300);
        sales2.add(350);  // total : 900
        list.add(sales2);

        final Sales sales3 = new Sales();
        sales3.add(400);
        sales3.add(450);
        sales3.add(500);  // total : 1350
        list.add(sales3);

        return list;
    }

Salesクラスのオブジェクトは3つ用意します。
各オブジェクトには3つの値を入力します。

[flatMap]
    public static void main(final String[] args) {

        final List<Sales> list = createData();

        final int total = list.
                    stream().
                    flatMap(v -> v.priceList.stream()).
                    collect(Collectors.summingInt(price -> price));

        System.out.println(total);
    }

flatMapにはListの要素内のオブジェクトが渡されるので

    v -> v.priceList.stream()

とやりIntegerのStreamを返却します。

flatMap以降のメソッドチェインでは
Streamとして扱わるようにになります。

サンプルではCollectでIntegerの値を合計しています。

[実行結果]
2700

【mapとflatMapの違い】

mapはCollectioinの要素を取り出して変換を行うメソッドで
flatMapはCollectionの要素を取り出してStreamへの変換を行うメソッドです。

map内でStreamを返却するようにした場合はどうなるでしょうか?
返却されるクラスを見てみます。

    final Stream<Stream<Integer>> test = list.stream().map(v -> v.priceList.stream());
    final Stream<Integer> test2 = list.stream().flatMap(v -> v.priceList.stream());

mapの場合はネストStreamが返され、flatMapは純粋なStreamが返されます。

【まとめ】

flatMapを使うとStreamを返すメソッドで、
ネストしたCollectionを処理する場合に使えることがわかりました。

ネストしたCollection以外にも使い道はあると思うのですが、
ぱっと思いつくのはこれくらいですかね・・・