2014-04-16 27 views
24

Giả sử có một lớp ObjJava8: giá trị tổng từ lĩnh vực cụ thể của các đối tượng trong danh sách

class Obj{ 

    int field; 
} 

và rằng bạn có một danh sách các Obj trường hợp, ví dụ: List<Obj> lst.

Bây giờ, làm thế nào tôi có thể tìm thấy trong Java8 với dòng tổng của các giá trị của các lĩnh vực int field từ các đối tượng trong danh sách lst dưới một tiêu chuẩn lọc (ví dụ cho một đối tượng o, tiêu chí là o.field > 10)?

Trả lời

60

Bạn có thể làm

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(o -> o.getField()).sum(); 

hoặc (sử dụng phương pháp tham khảo)

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(Obj::getField).sum(); 
+0

một trong những câu trả lời tốt nhất .. –

+0

Hoặc 'int sum = lst.stream(). MapToInt (obj :: getField) .filter (n -> n> 10) .sum(); ' – 4castle

3

Hãy thử:

int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum(); 
4

Bạn có thể thử

int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum(); 

Giống như giải thích here

3

Bạn cũng có thể collect với một nhà sưu tập tổng hợp thích hợp như Collectors#summingInt(ToIntFunction)

Trả về một Collector sản xuất tổng của một hàm số nguyên có giá trị áp dụng cho các yếu tố đầu vào. Nếu không có yếu tố này là hiện tại, kết quả là 0.

Ví dụ

Stream<Obj> filtered = list.stream().filter(o -> o.field > 10); 
int sum = filtered.collect(Collectors.summingInt(o -> o.field)); 
Các vấn đề liên quan