如何使用流对 Map 中的值求和?
How to sum values in a Map with a stream?
我想要一个流的等价物:
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().mapToInt(Integer::parseInt).sum();
这是另一种方法:
int sum = data.values().stream().reduce(0, Integer::sum);
(对于仅 int
的总和,Paul 的回答减少了装箱和拆箱。)
至于一般,我认为没有比这更方便的方法了。
我们可以这样做:
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
也是有问题的,因为它 returns Optional
。上面的sum
方法对于空map会抛出异常,但是空的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);
你可以这样做:
int creditAmountSum = result.stream().map(e -> e.getCreditAmount()).reduce(0, (x, y) -> x + y);
对于双打,你可以简单地使用它。
Double sum = myMap.values().stream().mapToDouble(d -> d).sum();
适合我。
Integer count = intMap.values().stream().mapToInt(d-> d).sum();
获取 HashMap.values
方法以 Stream 和 collect mapToIn
with lambda expression ending with aggregation sum method.
我想要一个流的等价物:
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().mapToInt(Integer::parseInt).sum();
这是另一种方法:
int sum = data.values().stream().reduce(0, Integer::sum);
(对于仅 int
的总和,Paul 的回答减少了装箱和拆箱。)
至于一般,我认为没有比这更方便的方法了。
我们可以这样做:
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
也是有问题的,因为它 returns Optional
。上面的sum
方法对于空map会抛出异常,但是空的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);
你可以这样做:
int creditAmountSum = result.stream().map(e -> e.getCreditAmount()).reduce(0, (x, y) -> x + y);
对于双打,你可以简单地使用它。
Double sum = myMap.values().stream().mapToDouble(d -> d).sum();
适合我。
Integer count = intMap.values().stream().mapToInt(d-> d).sum();
获取 HashMap.values
方法以 Stream 和 collect mapToIn
with lambda expression ending with aggregation sum method.