通过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)
}

参考链接:

  1. https://wenku.baidu.com/view/d41ed95e32b765ce0508763231126edb6f1a7667.html
  2. https://blog.csdn.net/qq_40813329/article/details/120006487
  3. https://deepmind.t-salon.cc/article/4169