【问题标题】:Java 8 Streams - summing multiple values in a type from a streamJava 8 Streams - 从流中对类型中的多个值求和
【发布时间】:2019-10-01 19:10:44
【问题描述】:

我正在尝试对一个类中从集合中流式传输的两个变量的总和进行求和。考虑以下简单的类。

class Widget {
    String colour;
    Double legs;
    Double arms;
    // ...
}

我想流式传输一组小部件,按颜色对它们进行分组并计算出(腿 + 手臂)的总和,以找到每种颜色的肢体总数。

我想做一些简单的事情,像这样 -

widgets.stream().collect(groupingBy(Widget::getColour, summingDouble(legs + arms)));

但是,没有 Collectors 函数可以让我指定一个自定义值来求和。

我的问题是:我需要编写自定义收集器还是有其他简单的方法来实现我想要的?

【问题讨论】:

    标签: java java-8 functional-programming java-stream collectors


    【解决方案1】:

    你可以使用Collectors.summingDouble():

    Map<String, Double> result = widgets.stream()
            .collect(Collectors.groupingBy(
                    Widget::getColour,
                    Collectors.summingDouble(w -> w.getArms() + w.getLegs())
            ));
    

    您可以只使用函数w -&gt; w.getArms() + w.getLegs() 对手臂和腿求和。

    【讨论】:

      【解决方案2】:

      您也可以在这里使用toMap

      Map<String, Double> colorToLimbsCount = widgets.stream()
              .collect(Collectors.toMap(Widget::getColour,
                      widget -> widget.getArms() + widget.getLegs(), Double::sum));
      

      groupingBy 表示中,它可能看起来像:

      Map<String, Double> colorToLimbsCount = widgets.stream()
              .collect(Collectors.groupingBy(Widget::getColour,
                      Collectors.reducing((double) 0,
                              widget -> widget.getArms() + widget.getLegs(), Double::sum)));
      

      【讨论】:

      • 您可以只使用0d 而不是将int(double) 0 一起使用。
      • @SamuelPhilipp 或只是0.0
      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 2018-03-03
      • 2020-01-18
      • 2020-01-11
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多