it-swarm.com.ru

Java8: сумма значений из определенного поля объектов в списке

Предположим, есть класс Obj

class Obj{

  int field;
}

и что у вас есть список экземпляров Obj, т.е. List<Obj> lst.

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

45
mat_boy

Ты можешь сделать

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();
94
Aniket Thakur

Вы также можете collect с соответствующим сборщиком суммирования, например Collectors#summingInt(ToIntFunction)

Возвращает Collector, который производит сумму целочисленной функции применяется к элементам ввода. Если элементов нет, результат это 0.

Например

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

Ты можешь попробовать

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

Как объяснил здесь

4
Paweł Ćwik

Пытаться:

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

В Java 8 для сущности Obj с методом field и getField () вы можете использовать:

List<Obj> objs ...

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

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