假设有一个Obj
类class Obj{
int field;
}
并且您有Obj
个实例的列表,即List<Obj> lst
。
现在,我如何在Java8中使用过滤标准在列表field
中的对象中找到int字段lst
的值的总和(例如,对于对象{{1} },标准是o
)?
答案 0 :(得分:105)
你可以做到
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();
答案 1 :(得分:4)
尝试:
int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
答案 2 :(得分:4)
答案 3 :(得分:4)
您还可以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 :(得分:0)
在Java 8中,对于具有Obj
和getField()方法的field
实体,可以使用:
List<Obj> objs ...
Stream<Obj> notNullObjs =
objs.stream().filter(obj -> obj.getValue() != null);
Double sum = notNullObjs.mapToDouble(Obj::getField).sum();
答案 5 :(得分:0)
您可以执行以下方法:“ IntSummaryStatistics”
IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();