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以外にも使い道はあると思うのですが、
ぱっと思いつくのはこれくらいですかね・・・