我们前面看到过这样的收集器:
List transactions = transactionStream.collect(Collectors.toList());
会把流中的数据依次填充到List中并返回。
long howManyDishes = menu.stream().collect(Collectors.counting());
counting算收集器的一种,就是对流中元素的个数进行计数,也可以使用count简化
long howManyDishes = menu.stream().count();
- Optional
mostCalorieDish = menu.stream() - .collect(Collectors.maxBy(Comparator.comparingInt(Dish::getCalories)));
通过Comparator.comparingInt()可以生成一个比较器
Collectors.maxBy用于获取最大值
同理,最小值使用minBy()
int total = menu.stream().collect(Collectors.summingInt(Dish::getCalories));
summingInt()用于求和,内部支持方法引用进行映射。
同样的,summingLong() summingDouble()也是类似的使用方法。
double avg = menu.stream().collect(averagingInt(Dish::getCalories));
averagingInt对元素进行均值运算,接收方法引用进行映射
同样的,也支持averagingLong() averagingDouble()
前面我们用到了counting()、maxBy()、minBy()、summingInt()、averagingInt(),现在使用summarizingInt()可以包含前面所有。
- IntSummaryStatistics menuStatistics = menu.stream()
- .collect(summarizingInt(Dish::getCalories));
IntSummaryStatistics就是统计数据的结果集:
IntSummaryStatistics{count=9, sum=4300, min=120, average=477.777778, max=800}
包含计数、求和、最小值、最大值、均值。
同样的,summarizingLong()、summarizingDouble()也可以使用,对应的结果集为LongSummaryStatistics、DoubleSummaryStatistics
String shortMenu = menu.stream().collect(joining());
joining()默认调用toString()方法,使用StringBuilder进行拼接,也支持使用分隔符进行拼接。
String shortMenu = menu.stream().map(Dish::getName).collect(joining(", "));