使用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);
}
}
测试结果: