通过Lambda表达式对List进行分组查询并统计相关数据参数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String name;
private Integer age;
private String className;
private String flag;
public Student(String className, String flag) {
this.className = className;
this.flag = flag;
}
}
public class StudentTest {
public static void main(String[] args) {
Student wangzz2 = new Student("wangzz", 11, "1班", "A");
Student wangzz1 = new Student("wangzz", 10, "1班", "A");
Student wangzz = new Student("wangzz", 10, "1班", "B");
Student wangyt1 = new Student("wangyt", 5, "2班", "C");
Student wangyt = new Student("wangyt", 5, "2班", "C");
List students = new ArrayList<>(Arrays.asList(wangzz, wangzz1, wangzz2, wangyt, wangyt1));
HashMap> collect = students.stream()
.collect(groupingBy(d -> new Student(d.getClassName(), d.getFlag()),
HashMap::new, toList()
));
System.out.println(collect);
List resList = new ArrayList<>();
for (Map.Entry> entry : collect.entrySet()) {
List value = entry.getValue();
if (CollectionUtils.isEmpty(value)) {
continue;
}
Student student = new Student();
// 复制基本属性
BeanUtils.copyProperties(value.get(0), student);
// 设置相关属性eg: age
Integer sumAge = value.stream().map(Student::getAge).reduce(Integer::sum).get();
student.setAge(sumAge);
resList.add(student);
}
resList.forEach(System.out::println);
}
// Student(name=wangzz, age=21, className=1班, flag=A)
// Student(name=wangzz, age=10, className=1班, flag=B)
// Student(name=wangyt, age=10, className=2班, flag=C)
}
参考链接:
- https://wenku.baidu.com/view/d41ed95e32b765ce0508763231126edb6f1a7667.html
- https://blog.csdn.net/qq_40813329/article/details/120006487
- https://deepmind.t-salon.cc/article/4169