List、Set集合如何使用Stream流求和呢?
下文笔者讲述list,Set集合借助Stream求和的方法及示例分享,如下所示
对多个属性分别分组求和
通常数据类型
借助reduce方法即可实现求和操作
例:Stream流求和的示例
一、泛型为Integer、Long、Double、BigDecimal求和
Integer sum = scores.stream().reduce(Integer::sum).orElse(0); Long sum = scores.stream().reduce(Long::sum).orElse(0L); Double sum = scores.stream().reduce(Double::sum).orElse(0.00); BigDecimal sum = scores.stream().reduce(BigDecimal::add).orElse(new BigDecimal(0.00));
二、泛型为实体类
对单个属性求和
Integer sum = sales.stream().mapToInt(Sale::getOrderNum).sum(); Long sum = sales.stream().mapToLong(Sale::getOrderNum).sum(); Double sum = sales.stream().mapToDouble(Sale::getOrderNum).sum(); BigDecimal sum = sales.stream().map(Sale::getAppleSale).reduce(BigDecimal.ZERO, BigDecimal::add);
对多个属性分别分组求和
并返回聚合后的对象
// 类型为BigDecimal Sale result = sales.stream() .reduce((x, y) -> newSale(x.getAppleSale().add(y.getAppleSale()),x.getBananaSale().add(y.getBananaSale()),x.getGrapeSale().add(y.getGrapeSale()))) .orElse(new Sale(BigDecimal.ZERO, BigDecimal.ZERO,BigDecimal.ZERO)); // 类型为Integer、Long、Double(注:orElse中需输入对应类型初始值) Sale sale = sales.stream() .reduce((x, y) -> new Sale(x.getAppleSale() + y.getAppleSale(), x.getBananaSale() + y.getBananaSale(), x.getGrapeSale() + y.getGrapeSale())) .orElse(new Sale(0.00, 0.00,0.00));
多字段乘积求和(基本数据类型)
int prices = list.stream().mapToInt(x-> x.getprice * x.getTotal).sum();
多字段乘积求和(BigDecimal)
BigDecimal prices = list
.stream()
.map(x-> x.getPrice()
.multiply(new BigDecimal(x.getTotal())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
对对象中的多个字段求和时 如果对象中属性非常非常多 还像上边一样写不现实
解决办法“转为map 遍历赋值 下边json处理使用的事hutool 的json处理
//构造返回结果
SafeJwggaqhhsetj one = new SafeJwggaqhhsetj();
//把结果转为map方便赋值
Map<String, Object> resMap = JSONUtil.toBean(JSONUtil.toJsonStr(one), Map.class);
//要求和的对象的list集合
List<SafeJwggaqhhsetj> list = this.list(queryWrapper);
//将对象list转为json数组
JSONArray array = JSONUtil.parseArray(JSONUtil.toJsonStr(list));
/
/将对象list转为map数组
List<Map> dataMap = JSONUtil.toList(array, Map.class);
//遍历变量名集合 keylist可能是 Arrays.asList(new String[]
{"personAmountChinese", "personManhoursChinese", })
for (String s : keylist) {
//求和
resMap.put(s, dataMap.stream().mapToInt(o -> {
AtomicReference<Integer> d = new AtomicReference<>();
Optional.ofNullable(o.get(s))
.map(p -> {
d.set((Integer) p);
return p;
})
.orElseGet(() -> {
d.set(0);
return 0;
});
return d.get();
}).sum());
}
one = JSONUtil.toBean(JSONUtil.toJsonStr(resMap), SafeJwggaqhhsetj.class);
对对象集合中的属性求和
单个bigdecimal属性的话直接 用map get 出来求和即可
例:
BigDecimal result2 = userList.stream()
// 将user对象的mongey取出来map为Bigdecimal
.map(User::getMoney)
// 使用reduce聚合函数,实现累加器
.reduce(BigDecimal.ZERO,BigDecimal::add);
此处为 将每个对象中多个属性求乘积以后再求和
p.getSkuCount() * p.getVolumeLength().multiply(p.getVolumeHeight()).multiply(p.getVolumeWidth()).intValue()
并且此处需要返回的count 是integer类型 如果是bigdecimal 参考 对单个属性求和 中的bigdecimal 即
可
public static void main(String[] args) {
List<ExtSkuLocationParam> locationAllSku = new ArrayList<>();
for (int i = 1; i < 3; i++) {
ExtSkuLocationParam a = new ExtSkuLocationParam();
a.setSkuCount(i);
a.setVolumeLength(new BigDecimal(i * 10));
a.setVolumeWidth(new BigDecimal(i * 10));
a.setVolumeHeight(new BigDecimal(i * 10));
locationAllSku.add(a);
}
Integer reduce = locationAllSku
.stream()
.reduce(0, (sum, p) -> sum += p.getSkuCount() * p.getVolumeLength().multiply(p.getVolumeHeight())
.multiply(p.getVolumeWidth()).intValue(), Integer::sum);
System.out.println(reduce);
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


