Java8:来自列表中对象的特定字段的值

时间:2014-04-16 13:25:25

标签: java filter java-8 java-stream

假设有一个Obj

class Obj{

  int field;
}

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

现在,我如何在Java8中使用过滤标准在列表field中的对象中找到int字段lst的值的总和(例如,对于对象{{1} },标准是o)?

6 个答案:

答案 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)

你可以尝试

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

与解释here

一样

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