Java 8 Streams - 将来自流的类型中的多个值相加

Java 8 Streams - summing multiple values in a type from a stream

我正在尝试对从集合中流出的 class 中的两个变量求和。考虑以下简单的 class.

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

我想流式传输一组 Widget,按颜色对它们进行分组,然后计算(腿 + 臂)的总和,找出每种颜色的肢体总数。

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

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

但是,没有允许我指定要求和的自定义值的 Collectors 函数。

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

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

你可以直接使用 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() 求和手臂和腿。