如何使用流对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, T> 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, T> 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);