Ответ 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();
Предположим, что для класса Obj
class Obj{
int field;
}
и что у вас есть список экземпляров Obj
, т.е. List<Obj> lst
.
Теперь, как я могу найти в Java8 с потоками сумму значений int fields field
из объектов в списке lst
в соответствии с критерием фильтрации (например, для объекта o
, критерием является o.field > 10
)?
Вы можете сделать
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();
Вы можете попробовать
int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum();
Как описано здесь
Try:
int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
Вы также можете 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));
В 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();