Java8でデータ・ストリームを収集

削減と概要

統計の総数

メニューの料理の何カウントするコレクターを使用します。

long howManyDishes = menu.stream().collect(Collectors.counting());

最大と最小の流れを探します

二つのコレクタは、最大および最小流量を計算するために、Collectors.maxByとCollectors.minBy、使用することができます。2つのコレクタ要素コンパレータストリームを比較するためのパラメータを受け取ります。あなたはカロリーに基づいて皿に比較するためにコンパレータを作成し、Collectors.maxByにそれを渡すことができます:

Comparator<Dish> dishCaloriesComparator = 
	Comparator.comparingInt(Dish::getCalories);
Optional<Dish> mostCaloriesDish = 
	menu.stream().collect(maxBy(dishCaloriesComparator))

集まります

Collectors.summingInt:特に要約のためのコレクタークラスは、ファクトリメソッドを提供します。なお、Int関数と戻りコレクタを必要なオブジェクトのマッピングの合計を受信することができる、我々は後に、通常の方法を収集する必要が要約実行動作の送信にコレクタ。例えば、それは総カロリーのメニューリストを決定することができます。

int totalCalories = menu.stream().collect(summingInt(Dish::getCalories));

合計の概要なお、だけでなく、:そこCollectors.averagingInt、対応するaveragingLong averagingDoubleとともに、平均値を計算することができます:

double avgCalories = 
	menu.stream().collect(averagingInt(Dish::getCalories));

一回の操作によってSummerizingするメニュー要素の数をカウントし、皿を合計、平均、最大値と最小値を与えるために加熱することができます。

IntSummaryStatistics menuStatistics = 
	menu.stream().collect(summarizingInt(Dish::getCalories));

印刷はmenuStaticsticObjectあろう:
IntSummaryStatistics = {COUNT 9、4300 SUM =、分= 120、平均= 477.77778、最大= 800}

接続文字列

接合コレクタ植物は、文字列の中に得られた各ターゲットアプリケーションtoStringメソッドの文字列のすべてのメソッドの戻りを対流します。次のようにこの方法は、メニューの料理の名前が一緒に接続され、使用することができます。

String shortMenu = menu.stream().map(Dish::getName()).collect(joining());

StringBuilderのは、生成された文字列に内部的に使用接合が一つずつ加算されます。
料理クラス自体は、料理の名前を返すようにtoStringメソッドを持っている場合は、次の方法を使用することができます。

String shortMenu = menu.stream().collect(joining());

工場の接合方法のヘビーデューティーバージョンを使用することにより、あなたは料理のコンマ区切りの名前のリストを取得することができます。

String shortMenu = menu.stream().collect(joining(","));

パケット

メニューは、料理の種類に応じて分類する必要がある場合には、肉のグループを入れて魚がグループを入れている、他の人は別のグループに入れています。Collectors.groupingByは、ファクトリメソッドから返されたコレクタ簡単にこのタスクを達成することができます。

Map<Dish.Type,List<Dish>> dishesByType = 
	menu.stream().collect(groupingBy(Dish::getType));

以下の結果は、マップである:
{FISH = [エビ、サケ] OTHER = [フライドポテト、米、季節フルーツ、ピザ]、肉= [豚肉、牛肉、鶏肉]}

マルチレベルのグループ化

グループの複数のレベルを達成するために、あなたはCollectors.groupingByファクトリメソッドの2パラメータのバージョンで作成されたトラップを使用することができます。

public enum CaloricLevel(DIET,NORMAL,FAT}
Map<Dish.Type,Map<CaloricLevel,List<Dish>>> dishesByTypeCaloricLevel =
    menu.stream().collect(
    	groupingBy(Dish::getType,
    		groupingBy(dish -> {
    			if (dish.getCalories() <= 400) return CaloricLevel.DIET;
    			else if(dish.getCalories() <=700) return CaloricLevel.NORMAL;
    			else return CaloricLevel.FAT;
    			})
    		)
    	);

さらにgroupingBy及び他のコレクタは組み合わせ、例えばgroupingByマッピングとコレクタ組み合わせて使用​​することができます。

Map<Dish.Type,Set<CaloricLevel>> caloricLevelByType = 
	menu.stream().collect(
		groupingBy(Dish::getType,mapping(
			dish-> { if (dish.getCalories() <= 400 ) return CaloricLevel.DIET;
			else if (dish.getCalories() <= 700 ) return CaloricLevel.NORMAL;
			else return CaloricLevel.FAT;
			},toSet()
			)
		) 
	);

パーティション

述語A(ブール値を返す関数)分類関数として、分配関数と呼ばれる:パケットを分割することは、特殊なケースです。

Map<Boolean,List<Dish>> partitionedMenu =
	menu.stream().collect(partitioningBy(Dish::isVegetarian));

あなたはpartitioningBy(ディッシュ:: isVegetarian)を見ることができるとgroupingBy(ディッシュ::のgetType)は戻り値の型に非常に似て何と同じではありません。
取得するためにgetメソッドを使用して、すべてのベジタリアン料理を探します:

List<Dish> vegetarianDishes = partitionedMenu.get(true);

以下の方法は、同じ結果を得るために使用することができます。

List<Dish> vegetarianDishes = menu.stream().filter(Dish::isVegetarian).collect(toList());
公開された75元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/zhengdong12345/article/details/102633354