Java8:对列表中对象的特定字段的值求和


81

假设有一个Obj类

class Obj{

  int field;
}

并且您有一个Obj实例列表,即List<Obj> lst

现在,如何在Java8中使用流条件在过滤条件下(例如,对于object ,条件为)field从列表中的对象中找到int字段值的总和?lstoo.field > 10

Answers:


154

你可以做

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

4
int sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
4castle

7

你可以试试

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

这里解释


6

您也可以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));

5

尝试:

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

0

在Java 8中,对于Obj带有fieldand getField()方法的实体,可以使用:

List<Obj> objs ...

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

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

这个答案对主题有什么帮助?问题中没有提到Indicator任何地方,所有答案都已经非常具体了。因此,除非您可以编辑答案以真正为当前主题添加有用的内容,否则建议您删除它。
奥利维尔·格雷戈雷(OlivierGrégoire)

更改名称以帮助Olivier的抽象思维。
Zon

0

您可以执行以下方法:“ IntSummaryStatistics”

IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.