Java8: сума значень з конкретного поля об'єктів у списку


82

Припустимо, мати клас Obj

class Obj{

  int field;
}

і що у вас є список Objекземплярів, тобто List<Obj> lst.

Тепер, як я можу знайти в Java8 з потоками суму значень полів int fieldіз об’єктів у списку lstза критерієм фільтрації (наприклад, для об’єкта o, критерієм є o.field > 10)?

Відповіді:


157

Ви можете зробити

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

або (за допомогою посилання на метод)

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

4
Абоint sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
4castle


6

Ви також можете collectз відповідним колектором підсумовування, наприкладCollectors#summingInt(ToIntFunction)

Повертає a, Collectorщо створює суму цілочисельної функції, застосованої до вхідних елементів. Якщо відсутні елементи, результат дорівнює 0.

Наприклад

Stream<Obj> filtered = list.stream().filter(o -> o.field > 10);
int sum = filtered.collect(Collectors.summingInt(o -> o.field));


0

У Java 8 для Objсутності з fieldметодом and getField () ви можете використовувати:

List<Obj> objs ...

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

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

Що ця відповідь додає до теми? У Indicatorзапитанні ніде не згадується , і всі відповіді вже дуже конкретні. Тож якщо ви не зможете відредагувати свою відповідь, щоб дійсно додати щось корисне до розглянутої теми, я пропоную вам її видалити.
Олів'є Грегуар,

Змінено імена, щоб допомогти абстрактному мисленню Олів'є.
Zon

0

Ви можете зробити цей метод: "IntSummaryStatistics"

IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.