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); }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。