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

我想要与此等同的流:

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类型,但是您可以理解。

回答:

这是另一种方法:

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

以上是 如何对流中的Map中的值求和? 的全部内容, 来源链接: utcz.com/qa/428508.html

回到顶部