JAVA List 用steam 实现两个字段的分组并求和
使用JDK8 的Steam来对实体类User( id,age,count)的两个字段(id,age)进行分组,并对分组之后的count 字段进行求和,代码如下:
实现逻辑主要在测试类Test3 的gruopAndSumCount 里
package com.shitouda; /** * @Description: 一个测试类 * @Author shitouda * @Date 2021-04-19 20:49 */ public class User { private Integer id; private Integer age; private Integer count; public User() { } public User(Integer id, Integer age, Integer count) { this.id = id; this.age = age; this.count = count; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } }
package com.shitouda; import java.util.ArrayList; import java.util.IntSummaryStatistics; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** * @Description: TODO * @Author shitouda * @Date 2021-04-19 20:50 */ public class Test3 { public List<User> gruopAndSumCount(List<com.shitouda.User> users){ Map<String, IntSummaryStatistics> collect = users.parallelStream() .collect(Collectors.groupingBy( a -> a.getId() + "_" + a.getAge(), Collectors.summarizingInt(a -> a.getCount())) ); List<User> users1 = new ArrayList<>(); collect.forEach((key,value) ->{ User user = new User(); String[] idAgeArr = key.split("_"); user.setId(Integer.valueOf(idAgeArr[0])); user.setAge(Integer.valueOf(idAgeArr[1])); Integer count = Math.toIntExact(value.getSum()); user.setCount(count); users1.add(user); }); return users1; } public static void main(String[] args) { List<User> users = new ArrayList<>(); User user1 = new User(1,1,3); User user2 = new User(1,1,5); User user3 = new User(2,1,5); User user4 = new User(2,1,2); User user5 = new User(2,1,2); User user6 = new User(3,3,2); users.add(user1); users.add(user2); users.add(user3); users.add(user4); users.add(user5); users.add(user6); Test3 test3 = new Test3(); List<User> list = test3.gruopAndSumCount(users); System.out.println(list); } }
测试结果: