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

mat*_*boy 61 java filter java-8 java-stream

假设有一个Obj类

class Obj{

  int field;
}
Run Code Online (Sandbox Code Playgroud)

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

现在,我如何在Java8中找到流中过滤标准下field列表中对象的int字段值的总和lst(例如,对象o,标准是o.field > 10)?

Ani*_*kur 117

你可以做

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(o -> o.getField()).sum();
Run Code Online (Sandbox Code Playgroud)

或(使用方法参考)

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(Obj::getField).sum();
Run Code Online (Sandbox Code Playgroud)

  • 或者`int sum = lst.stream().mapToInt(Obj :: getField).filter(n - > n> 10).sum();` (2认同)

Zon*_*Zon 7

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

List<Obj> objs ...

Double sum = objs.stream()
  .filter(Objects::notNull);
  .mapToDouble(Obj::getField)
  .sum();
Run Code Online (Sandbox Code Playgroud)


Jea*_*ean 5

尝试:

int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以试试

int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum();
Run Code Online (Sandbox Code Playgroud)

这里解释


Sot*_*lis 5

您也可以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));
Run Code Online (Sandbox Code Playgroud)