java stream 分组求和_Java stream List 求和、分组操作

Java stream List 求和、分组操作

前言

项目中经常会使用Stream操作一些集合数据,今天记录一下我经常使用的Stream操作

求和操作public static void main(String[] args) {

List users = generateUserList();int reduce = users.stream().mapToInt(x -> x.getSalary().intValue()).reduce(0, Integer::sum);

log.info("Int sum - {}", reduce);

BigDecimal reduce1 = users.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);

log.info("BigDecimal sum - {}", reduce);

}private static List generateUserList() {

List users = new ArrayList<>();for (int i = 0; i 

users.add(new User((long) (i + 1), StrFormatter.format("用户-{}", i), RandomUtil.randomBigDecimal(new BigDecimal(1000), new BigDecimal(100000))));

}return users;

}复制代码

结果:16:03:32.966 [main] INFO com.springboot.example.stream.StreamTest - Int sum - 31128616:03:32.977 [main] INFO com.springboot.example.stream.StreamTest - BigDecimal sum - 311286复制代码

这里使用了Integer 及BigDecimal类型的求和,其他的例如Long Double类型的自行尝试,操作都是一样的。

分组操作Map> groups = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.toList()));复制代码

结果16:19:24.018 [main] INFO com.springboot.example.stream.StreamTest - groups - {"用户-0":[{"name":"用户-0","id":1,"salary":44133.974869422615}],"用户-1":[{"name":"用户-1","id":2,"salary":32433.52878974182}],"用户-4":[{"name":"用户-4","id":5,"salary":26726.1799749091}],"用户-2":[{"name":"用户-2","id":3,"salary":83274.99312309967}],"用户-3":[{"name":"用户-3","id":4,"salary":1579.9248811900475}]}复制代码

自定义分组的数据结构List groupCustomize = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.toList())).entrySet().stream().map(e -> {

Map newObj = new HashMap<>();

newObj.put("name", e.getKey());

newObj.put("items", e.getValue());return newObj;

}).collect(Collectors.toList());复制代码

结果16:24:23.554 [main] INFO com.springboot.example.stream.StreamTest - groups customize - [{"name":"用户-0","items":[{"name":"用户-0","id":1,"salary":69329.43639757435}]},{"name":"用户-1","items":[{"name":"用户-1","id":2,"salary":14632.879595342842}]},{"name":"用户-4","items":[{"name":"用户-4","id":5,"salary":52953.301688394306}]},{"name":"用户-2","items":[{"name":"用户-2","id":3,"salary":29500.813638173757}]},{"name":"用户-3","items":[{"name":"用户-3","id":4,"salary":30750.353923258994}]}]复制代码

可以使用JavaStream API来实现分组求和操作。假设有一个包含对象的列表,对象中有两个属性:类型和数值。我们想要将列表中的对象按照类型进行分组,并计算每个类型对应的数值总和。下面是一个示例代码: ```java import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class GroupingAndSummingExample { public static void main(String[] args) { // 创建对象列表 List<DataObject> dataObjects = Arrays.asList( new DataObject("A", 10), new DataObject("B", 20), new DataObject("A", 30), new DataObject("B", 40), new DataObject("C", 50) ); // 使用Stream进行分组求和 Map<String, Integer> sumByType = dataObjects.stream() .collect(Collectors.groupingBy(DataObject::getType, Collectors.summingInt(DataObject::getValue))); // 打印结果 sumByType.forEach((type, sum) -> System.out.println(type + ": " + sum)); } } class DataObject { private String type; private int value; public DataObject(String type, int value) { this.type = type; this.value = value; } public String getType() { return type; } public int getValue() { return value; } } ``` 运行以上代码,将会输出以下结果: ``` A: 40 B: 60 C: 50 ``` 代码中,我们使用`Collectors.groupingBy`方法来对数据对象进行分组,按照类型(`DataObject::getType`)进行分组。然后,我们使用`Collectors.summingInt`方法对每个分组进行求和,按照数值属性(`DataObject::getValue`)累加求和。最后,我们将结果打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值