【问题标题】:Sum values from specific field of the objects in a list对列表中对象的特定字段的值求和
【发布时间】: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


    【解决方案1】:

    你可以这样做:“IntSummaryStatistics”

    IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
    

    【讨论】:

      【解决方案2】:

      在 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,所有的答案都已经非常具体了。因此,除非您可以编辑您的答案以真正为手头的主题添加一些有用的东西,否则我建议您删除它。
      • 改名以帮助 Olivier 的抽象思维。
      【解决方案3】:

      你可以的

      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 -&gt; n &gt; 10).sum();
      【解决方案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));
      

      【讨论】:

        【解决方案5】:

        试试:

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

        【讨论】:

          【解决方案6】:

          你可以试试

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

          就像解释here

          【讨论】:

            猜你喜欢
            • 2012-07-13
            • 1970-01-01
            • 2021-05-22
            • 2016-07-10
            • 2014-05-31
            • 2011-12-21
            • 2020-08-08
            • 1970-01-01
            相关资源
            最近更新 更多