在java8 JDK包含许多聚合操作(如平均值,总和,最小,***,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作。 JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个collection集合实例。很多的reduce操作执行特定的任务,如求平均值或按类别分 组元素。
JDK提供的通用的聚合操作:Stream.reduce,Stream.collection
注意:本文将reduction operations翻译为聚合操作,因为reduction operations通常用于汇聚统计。
两者的区别:
Stream.reduce,常用的方法有average, sum, min, max, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值
Stream.collection与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值
packagelambda;
importjava.util.Arrays;
importjava.util.List;
importjava.util.Map;
importjava.util.stream.Collectors;
publicclassLambdaMapReduce {
privatestaticList users = Arrays.asList(
newUser(1,"张三",12,User.Sex.MALE),
newUser(2,"李四",21, User.Sex.FEMALE),
newUser(3,"王五",32, User.Sex.MALE),
newUser(4,"赵六",32, User.Sex.FEMALE));
publicstaticvoidmain(String[] args) {
reduceAvg();
reduceSum();
//与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值
//获取所有男性用户的平均年龄
Averager averageCollect = users.parallelStream()
.filter(p -> p.getGender() == User.Sex.MALE)
.map(User::getAge)
.collect(Averager::new, Averager::accept, Averager::combine);
System.out.println("Average age of male members: "
+ averageCollect.average());
//获取年龄大于12的用户列表
List list = users.parallelStream().filter(p -> p.age > 12)
.collect(Collectors.toList());
System.out.println(list);
//按性别统计用户数
Map map = users.parallelStream().collect(
Collectors.groupingBy(User::getGender,
Collectors.summingInt(p -> 1)));
System.out.println(map);
//按性别获取用户名称
Map> map2 = users.stream()
.collect(
Collectors.groupingBy(
User::getGender,
Collectors.mapping(User::getName,
Collectors.toList())));
System.out.println(map2);
//按性别求年龄的总和
Map map3 = users.stream().collect(
Collectors.groupingBy(User::getGender,
Collectors.reducing(0, User::getAge, Integer::sum)));
System.out.println(map3);
//按性别求年龄的平均值
Map map4 = users.stream().collect(
Collectors.groupingBy(User::getGender,
Collectors.averagingInt(User::getAge)));
System.out.println(map4);
}
// 注意,reduce操作每处理一个元素总是创建一个新值,
// Stream.reduce适用于返回单个结果值的情况
//获取所有用户的平均年龄
privatestaticvoidreduceAvg() {
// mapToInt的pipeline后面可以是average,max,min,count,sum
doubleavg = users.parallelStream().mapToInt(User::getAge)
.average().getAsDouble();
System.out.println("reduceAvg User Age: "+ avg);
}
//获取所有用户的年龄总和
privatestaticvoidreduceSum() {
doublesum = users.parallelStream().mapToInt(User::getAge)
.reduce(0, (x, y) -> x + y);// 可以简写为.sum()
System.out.println("reduceSum User Age: "+ sum);
}
}
三、参考
本文链接:http://my.oschina.net/cloudcoder/blog/215169
【编辑推荐】
【责任编辑:chenqingxiang TEL:(010)68476606】
点赞 0