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

时间:2015-05-06 23:36:48

标签: java java-8 java-stream generics

我想要一个与流相同的东西:

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,但你明白了。

5 个答案:

答案 0 :(得分:63)

你可以这样做:

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

答案 1 :(得分:11)

以下是另一种方法:

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);

但是你总是在夏天结束。 reduce也存在问题,因为它会返回Optional。上面的sum方法会抛出一个空映射的异常,但是一个空的总和应该是0.当然,我们也可以传递0:

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);

答案 2 :(得分:1)

你可以这样做:

int creditAmountSum = result.stream().map(e -> e.getCreditAmount()).reduce(0, (x, y) -> x + y);

答案 3 :(得分:0)

对于双打,您可以简单地使用它。

Double sum = myMap.values().stream().mapToDouble(d -> d).sum();

对我有用。

答案 4 :(得分:0)

Integer count = intMap.values().stream().mapToInt(d-> d).sum();

获取 HashMap.values 方法以进行 Stream 并收集 mapToIn,其 lambda 表达式以聚合 sum 方法结尾。