Chúng ta có bất kỳ hàm tổng hợp nào trong Java để thực hiện kết hợp dưới đây không?Danh sách tổng hợp các đối tượng trong Java
Person {
String name;
String subject;
String department;
Long mark1;
Long mark2;
Long mark3;
}
Danh sách chứa dữ liệu như sau.
Name |Subject |Department |Mark1 |Mark2 |Mark3 --------|-----------|-----------|-------|-------|----- Clark |English |DEP1 |7 |8 |6 Michel |English |DEP1 |6 |4 |7 Dave |Maths |DEP2 |3 |5 |6 Mario |Maths |DEP1 |9 |7 |8
Tiêu chí tổng hợp là Subject & Dep. Đối tượng kết quả cần phải là
Subject |Department |Mark1 |Mark2 |Mark3 ----------- |-----------|-------|-------|----- English |DEP1 |13 |12 |13 Maths |DEP2 |3 |5 |6 Maths |DEP1 |9 |7 |8
Kết hợp này có thể đạt được bằng cách lặp lại theo cách thủ công trong danh sách và tạo danh sách tổng hợp. Ví dụ như dưới đây.
private static List<Person> getGrouped(List<Person> origList) {
Map<String, Person> grpMap = new HashMap<String, Person>();
for (Person person : origList) {
String key = person.getDepartment() + person.getSubject();
if (grpMap.containsKey(key)) {
Person grpdPerson = grpMap.get(key);
grpdPerson.setMark1(grpdPerson.getMark1() + person.getMark1());
grpdPerson.setMark2(grpdPerson.getMark2() + person.getMark2());
grpdPerson.setMark3(grpdPerson.getMark3() + person.getMark3());
} else {
grpMap.put(key, person);
}
}
return new ArrayList<Person>(grpMap.values());
}
Nhưng có bất kỳ chức năng hoặc tính năng tổng hợp nào của Java 8 mà chúng tôi có thể tận dụng không?
Các luồng có trình thu thập nhóm có thể giúp bạn ở đây. – Kayaman
Nhìn vào http://stackoverflow.com/questions/21020562/aggregate-functions-over-a-list-in-java nó có một ví dụ về thực hiện một nhóm tương tự bằng cách sử dụng Stream.collect – Jaiprakash
Bạn có thể chứng minh cách lặp lại thủ công sẽ nhìn? – shmosel