如何使用流对地图中的值求和?

2022-08-31 20:25:07

我想要一个流的等价物:

public static <T extends Number> T getSum(final Map<String, T> data) {
    T sum = 0;
    for (String key: data.keySet())
        sum += data.get(key);
    return sum;
}

此代码实际上不会编译,因为无法将 0 分配给类型 T,但你明白了。


答案 1

您可以执行以下操作:

int sum = data.values().stream().mapToInt(Integer::parseInt).sum();

答案 2

这是执行此操作的另一种方法:

int sum = data.values().stream().reduce(0, Integer::sum);

(然而,总而言之,保罗的答案减少了拳击和拆箱。int

至于一般地这样做,我认为没有一种方法可以更方便。

我们可以做这样的事情:

static <T> T sum(Map<?, T> m, BinaryOperator<T> summer) {
    return m.values().stream().reduce(summer).get();
}

int sum = MyMath.sum(data, Integer::sum);

但你总是最终度过夏天。 也是有问题的,因为它返回 。上述方法为空映射引发异常,但空总和应为 0。当然,我们也可以传递 0:reduceOptionalsum

static <T> T sum(Map<?, T> m, T identity, BinaryOperator<T> summer) {
    return m.values().stream().reduce(identity, summer);
}

int sum = MyMath.sum(data, 0, Integer::sum);

推荐