list stream 最大和最小值_Java Stream流处理之列表的求和求平均求最大最小值

本文接着Java Stream 流处理之列表的分组过滤排序继续讲求和、求平均、求最大最小值,初始数据接上篇。

Java Stream原生自带简单的聚合计算,比如Integer、Long。但是我们还需要用到BigDecimal等类型。

求和

在Java8以前,如果要对Human列表中所有人的weight求和,通常来讲我们只能循环,比如:

BigDecimal w = BigDecimal.ZERO;

for (Human h:list){

w=w.add(h.getWeight());

}

而现在我们可以这样写

BigDecimal weights = list.stream().map(Human::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);

而针对Long或者Integer类型的求和计算,则更为简单,比如所有人年龄求和:

Integer ages = list.stream().mapToInt(Human::getAge).sum();

求平均

Java8自带了求平均的语法糖,比如计算所有人的平均年龄:

Double aveAge = list.stream().mapToInt(Human::getAge).average().getAsDouble();

注意,求计算平均值的结果是浮点类型,和原始类型以及不一样了。

那如果是BigDecimal类型如何计算平均值呢?Java并没有提供快捷语法糖,但是既然我们都能求和了,那计算平均值其实也很好解决:

BigDecimal weights = list.stream().map(Human::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add)

.divide(new BigDecimal(list.size())).setScale(2,BigDecimal.ROUND_HALF_DOWN);

并没有什么花哨的东西,就是基于求和的基础上做除法,只是BigDecimal类型的特殊之处在于需要制定精度以及近似值方式。

最大最小值

同样的,Java也提供了最大最小值的语法糖,举个栗子,最大年龄:

Human h = list.stream().max(Comparator.comparing(Human::getAge)).get();

你看到了什么?还记得上一篇提到的按姓名排序么?Comparator.comparing(Human::getAge)这个的作用其实是用于排序,只是指定了max相当于是按年龄降序,最后get()取出来的就是最大值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值