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

我想要一个与流相当的:

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

这段代码实际上并没有编译,因为0不能分配给类型T,但是你明白了。

你可以这样做:

 int sum = data.values().stream().mapToInt(Number::intValue).sum(); 

这是另一种方法:

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

(然而,对于只有int的总和,保罗的答案减少了拳击和拆箱。)

至于做到这一点,我认为没有一种方法更方便。

我们可以这样做:

 static  T sum(Map m, BinaryOperator summer) { return m.values().stream().reduce(summer).get(); } int sum = MyMath.sum(data, Integer::sum); 

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

 static  T sum(Map m, T identity, BinaryOperator summer) { return m.values().stream().reduce(identity, summer); } int sum = MyMath.sum(data, 0, Integer::sum); 

你可以这样做:

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