読者です 読者をやめる 読者になる 読者になる

ITお絵かき修行

3歩歩いても忘れないために

StreamAPIのおさらい - java.util.stream.Collector

JavaSE8で導入されたStreamAPIを使用してできる処理のうち、java.util.stream.Collectorクラスの機能を利用してできる処理を書いてみた。

【やること】
java.util.stream.Collector系クラスのメソッドを使ってできる処理をさらう。
Java Collectorメモ(Hishidama's Java8 Collector Memo) で紹介されているメソッドを全部書いてみる。
・分類分けに関しては蒐集してやんよ java.util.stream.Collectors クラス (1) - Map 以外を返す Collector - - 倭マン's BLOG を参考にさせていただいた。


【環境】
Java
・jdk1.8.0_25
IDE
Eclipse Luna SR1 (4.4.1)


【資産】
具体的な使い方はソースを参照。

1.汎用的なCollector

(1)Collectors#mapping・・・値の変換
(2)Collectors#reducing・・・値の集約
StreamSample/GeneralCollector.java at master · hhhhhskw/StreamSample · GitHub

2.文字列に関するCollector

(1)Collectors#joining・・・文字列の結合
StreamSample/StringCollector.java at master · hhhhhskw/StreamSample · GitHub

3.StreamからCollectionへ変換するCollector

(1)Collectors#toCollection・・・Collectionクラスへ変換
(2)Collection#toList・・・Listクラスへ変換
(3)Collection#toSet・・・Setクラスへ変換
StreamSample/StreamToCollectionCollector.java at master · hhhhhskw/StreamSample · GitHub

4.StreamからMapへ変換するCollectior

(1)Collections#toMap・・・Mapクラスへ変換
(2)Collection#toConcurrentHashMap・・・ConcurrentHashMapへ変換
StreamSample/StreamToMapCollector.java at master · hhhhhskw/StreamSample · GitHub

5.Streamの統計に関するCollector

(1)Collectors#counting・・・Streamの要素数
(2)Collection#min・・・Stream内の最小値
(3)Collectors#max・・・Stream内の最大値
(4)Collectors#summingInt・・・Stream(int)の総和
(5)Collectors#summingLong・・・Stream(long)の総和
(6)Collectors#summingDouble・・・Stream(double)の総和
(7)Collectors#averagingInt・・・Stream(int)の平均
(8)Collectors#averagingLong・・・Stream(long)の平均
(9)Collectors#averagingDouble・・・Stream(double)の平均
(10)Collectors#summarizingInt・・・Stream(int)の統計情報
(11)Collectors#summarizingLong・・・Stream(long)の統計情報
(12)Collectors#summarizingDouble・・・Stream(double)の統計情報
StreamSample/SummaryCollector.java at master · hhhhhskw/StreamSample · GitHub

6.Streamに対して条件判定を適用するCollector

(1)Collectors#partitioningBy・・・指定した条件判定を適用する
(2)Collectors#partitioningByRule・・・指定した条件判定を適用する(返却する値の形式は別に指定する)
StreamSample/PartitioningCollector.java at master · hhhhhskw/StreamSample · GitHub

7.Streamに対してグループ分け

(1)Collectors#groupingBy()・・・グルーピング
(2)Collectors#groupingByConcurrent()・・・グルーピング(戻り値がConcurrentHashMap)
StreamSample/GroupingCollector.java at master · hhhhhskw/StreamSample · GitHub


全てをまとめたクラスは以下
StreamSample/CollectorSample.java at master · hhhhhskw/StreamSample · GitHub


【感想】
・数値系の操作はsummarizingInt等で大体こと足りそう。
→StreamAPI側の実装で詳しく書きすぎると可読性が落ちるので、機能が足りないときは別メソッドに委譲するべき?オレオレCollectorで対応する?
・CollectionsクラスのJavaDoc無いと実装できない・・・
ラムダ式内での型変換で何回かハマった。
ラムダ式で使用する関数インタフェースクラス(Predicateクラス、Functionクラス等)のメソッド仕様を理解してないとハマる。


【参考文献・URL】
Collectors (Java Platform SE 8 )
Collector (Java Platform SE 8 )
Java Collectorメモ(Hishidama's Java8 Collector Memo)
蒐集してやんよ java.util.stream.Collectors クラス (1) - Map 以外を返す Collector - - 倭マン's BLOG

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

Javaによる関数型プログラミング ―Java 8ラムダ式とStream