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
- 作者: Venkat Subramaniam,株式会社プログラミングシステム社
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る