Java8: tổng các giá trị từ trường cụ thể của các đối tượng trong danh sách


81

Giả sử có một lớp obj

class Obj{

  int field;
}

và bạn có một danh sách các Objtrường hợp, tức là List<Obj> lst.

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

Câu trả lời:


154

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 tham chiếu Phương pháp)

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

4
Hoặcint sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
4 lâu đài

7

Bạn co thể thử

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

Như đã giải thích ở đây


6

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

Trả về một hàm Collectortạo ra tổng của một hàm có giá trị nguyên được áp dụng cho các phần tử đầu vào. Nếu không có phần tử nào thì 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));

5

Thử:

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

0

Trong Java 8 đối với một Objthực thể có fieldvà phương thức getField (), bạn có thể sử dụng:

List<Obj> objs ...

Stream<Obj> notNullObjs =
  objs.stream().filter(obj -> obj.getValue() != null);

Double sum = notNullObjs.mapToDouble(Obj::getField).sum();

Câu trả lời này bổ sung gì cho chủ đề? Không có Indicatorbất kỳ đề cập nào trong câu hỏi, và tất cả các câu trả lời đã rất cụ thể. Vì vậy, trừ khi bạn có thể chỉnh sửa câu trả lời của mình để thực sự thêm một cái gì đó hữu ích cho chủ đề hiện tại, tôi khuyên bạn nên xóa nó.
Olivier Grégoire

Đã thay đổi tên để giúp Olivier tư duy trừu tượng.
Zon

0

Bạn có thể thực hiện phương pháp này: "IntSummarySt Statistics"

IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.