Tôi có Bản đồ Danh sách của một đối tượng cụ thể và tôi muốn thêm tất cả các phần tử của danh sách dựa trên biến mẫu cụ thể.Java 8 - Cách tổng hợp tất cả phần tử Danh sách trong Bản đồ Danh sách
Object của tôi:
class Risk{
Integer id, riskValue, totRisk=0;
String name;
Integer getId(){
return id;
}
Risk(Object[] result){
id=(Integer)result[0];
riskValue=(Integer)result[1];
name=(String)result[3];
}
}
tôi nhận được từ cơ sở dữ liệu một Danh sách Mảng kiểu đối tượng:
List<Object[]> results=getResults();
tôi sử dụng Java 8 vào nhóm dữ liệu của tôi bằng ID, bởi vì tôi muốn SUM by riskValue
tất cả các đối tượng thuộc loại Risk
có cùng số id
.
Đây là những gì tôi làm:
List<Risk> risks=results.stream().map(Risk::new).collect(Collectors.toList());
Map<Integer, List<Risk>> byId=risks.stream.collect(Collectors.groupingBy(Risk::getId));
Tại thời điểm này, tôi có tất cả các đối tượng rủi ro của tôi được phân nhóm theo ID. Và tôi muốn cho mỗi danh sách để tổng hợp tất cả các đối tượng bằng cách riskValue
và có tổng trong biến totRisk
Làm thế nào để tính toán trong biến totRisk
tổng của các biến riskValue
trong mỗi mục sách?
Note1: Tôi muốn làm điều đó bằng cách sử dụng Java 8, tôi biết cách sử dụng Java 7 trở xuống.
Lưu ý2: Có lẽ bạn cũng có thể thực hiện việc này một lần bằng cách không phải là nhóm đầu tiên theo ID. Những gì tôi muốn đạt được là tổng hợp tất cả các đối tượng với cùng một ID trong bản gốc List<Object[]> results
. Nếu nó có thể được thực hiện với chỉ một tuyên bố thậm chí còn tốt hơn.
Chỉ cần chắc chắn: Bản đồ đó là Bản đồ của "id": "total" cho id đó, đúng không? –
horus
Bạn nói đúng, nó ánh xạ tới 'total' – Holger
điều cuối cùng: sử dụng biểu thức lambda như bạn đã viết ở trên bằng cách thay thế ** Risk :: getTotRisk ** with ** r -> r.totRisk ** không hoạt động với tôi (nó không biên dịch). Có thể đạt được nó với một lamba mà không cần phải tạo ra getter? – horus