Подтвердить что ты не робот

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

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

class Obj{

  int field;
}

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

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

4b9b3361

Ответ 1

Вы можете сделать

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();

Ответ 2

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

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

Как описано здесь

Ответ 3

Try:

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

Ответ 4

Вы также можете 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));

Ответ 5

В 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();