List、Set集合如何使用Stream流求和呢?

重生 Java经验 发布时间:2024-02-03 09:53:42 阅读数:2603 1
下文笔者讲述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);
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202402/17069253657901.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者