java steam collect_Java8 如何进行stream reduce,collection操作

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值