Java 8 Streams-对流中的一个类型中的多个值求和

时间:2019-05-14 17:39:20

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

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

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

我想流式微件的集合,将它们按颜色分组,然后计算(腿和手臂)的总和,以找到每种颜色的肢体总数。

我想做些简单的事情-

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

但是,没有收集器功能可以让我指定自定义值进行求和。

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

2 个答案:

答案 0 :(得分:3)

您也可以在此处使用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)));

答案 1 :(得分:3)

您可以只使用Collectors.summingDouble()

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

您可以仅使用函数w -> w.getArms() + w.getLegs()对手臂和腿进行求和。