【发布时间】:2020-10-02 02:08:56
【问题描述】:
我创建了一个Map<String, List<Integer>> 来针对一个键存储多个值。现在我想对 List 中的所有值求和并将类型更改为 Map<String, Integer>。我如何使用 Java 8 流来做到这一点?没有它是否可以做同样的事情
【问题讨论】:
-
当然没有流也可以。到目前为止,您尝试过什么?
标签: java
我创建了一个Map<String, List<Integer>> 来针对一个键存储多个值。现在我想对 List 中的所有值求和并将类型更改为 Map<String, Integer>。我如何使用 Java 8 流来做到这一点?没有它是否可以做同样的事情
【问题讨论】:
标签: java
这是一种不使用流的方法:
Map<String, Integer> resultMap = new LinkedHashMap<>();
sourceMap.forEach((k, v) -> v.forEach(e -> resultMap.merge(k, e, Integer::sum)));
这使用Map.merge 方法来执行归约。
带有流的版本如下:
Map<String, Integer> resultMap = sourceMap.entrySet().stream()
.flatMap(e -> e.getValue().stream()
.map(v -> new AbstractMap.SimpleEntry<>(e.getKey(), v)))
.collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue(),
Integer::sum));
【讨论】:
朋友来了
Map<String,Integer> output new HashMap<String,Integer>();
Map<String,List<Integer>> gfg = new HashMap<String,List<Integer>>();
for (Map.Entry<String,List<Integer>> entry : gfg.entrySet()){
Integer int = 0;
for (Integer i :entry.getValue()){
int+=i
}
output.put(entry.getKey(),Integer.toString(int));
System.out.println("Key = " + entry.getKey() +
", Value = " + entry.getValue());
}
这是一种更开放的方法,可以进行细微的更改
【讨论】:
@fps 已经发布了一个很好的答案,您可以使用流尝试这种简单的方法
Map<String, Integer> resultMap =
sourceMap.entrySet()
.stream()
.collect(Collectors.toMap(e -> e.getKey(),
e -> e.getValue().stream().mapToInt(i -> i).sum()));
【讨论】: