Collectors.collectingAndThenとは
Collect
後の値を処理した値を返すCollector
です。
使い方
以下のような状況があったとします。
リストに一時的に格納→処理を呼び出す
List<Integer> mappedList = /* Stream */
./* mapなど、stream処理 */
.collect(Collectors.toList());
return hogeFunc(mappedList);
このような処理は、Collectors.collectingAndThen
を使うことで以下のように書けます。
Collectors.collectingAndThenを使った形
return /* Stream */
./* mapなど、stream処理 */
.collect(
Collectors.collectingAndThen(
Collectors.toList(),
mappedList -> hogeFunc(mappedList) // mappedListを使った処理
)
);
何が嬉しいのか?
一時変数が減る
Collect結果を一時変数に一々格納する必要が無いので、一時変数が減らせます。
一時変数を置くことは可読性やコード品質の低下に繋がるので、それが減るのは嬉しいです。
直渡しより可読性が上がる
一番初めに挙げたコード例は、以下のように書くこともできます。
直で関数に引数を渡す形式で書いた場合
return hogeFunc(
/* Stream */
./* mapなど、stream処理 */
.collect(Collectors.toList())
);
しかし、これでは特に関数がネストしていく場合の可読性が低い1です。
また、これだとデバッガで引っ掛けて中身を読めないという欠点が有ります。
まとめ
Collectors.collectingAndThen
、使っていきましょう。
-
この場面に関しては、パイプライン演算子が有れば
Collectors.collectingAndThen
を使う必要も無いんですが……。 ↩