【发布时间】:2014-05-31 09:49:18
【问题描述】:
假设有一个类Obj:
class Obj {
int field;
}
...并且您有一个Obj 实例列表,即List<Obj> lst。
现在,我怎样才能在过滤条件下从列表lst 中的对象中找到int 字段field 的值的总和(例如,对于对象o,条件是o.field > 10 )?
【问题讨论】:
标签: java filter java-8 java-stream
假设有一个类Obj:
class Obj {
int field;
}
...并且您有一个Obj 实例列表,即List<Obj> lst。
现在,我怎样才能在过滤条件下从列表lst 中的对象中找到int 字段field 的值的总和(例如,对于对象o,条件是o.field > 10 )?
【问题讨论】:
标签: java filter java-8 java-stream
你可以这样做:“IntSummaryStatistics”
IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
【讨论】:
在 Java 8 中,对于带有 field 和 getField() 方法的 Obj 实体,您可以使用:
List<Obj> objs ...
Stream<Obj> notNullObjs =
objs.stream().filter(obj -> obj.getValue() != null);
Double sum = notNullObjs.mapToDouble(Obj::getField).sum();
【讨论】:
Indicator,所有的答案都已经非常具体了。因此,除非您可以编辑您的答案以真正为手头的主题添加一些有用的东西,否则我建议您删除它。
你可以的
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 = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
您也可以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));
【讨论】:
试试:
int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
【讨论】:
【讨论】: