java - 使用 Java Stream API 将 Map<K, Map<V, X>> 中的类型 X 转换为 Y

标签 java dictionary java-8 java-stream collectors

我想从 map 的 map 转换内部 map 。

旧 map :Map<String, Map<LocalDate, Integer>>整数表示秒

新 map :Map<String, Map<LocalDate, Duration>>

我尝试创建新的内部 map ,但出现错误

Error: java: no suitable method found for putAll(java.util.stream.Stream<java.lang.Object>) method java.util.Map.putAll(java.util.Map<? extends java.time.LocalDate,? extends java.time.Duration>) is not applicable

oldMap.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey,
                e -> new HashMap<LocalDate, Duration>() {{
                    putAll(
                        e.getValue().entrySet().stream()
                            .map(x -> new HashMap.SimpleEntry<LocalDate, Duration>
                                (x.getKey(), Duration.ofSeconds(x.getValue())))
                    );
                }}
            ));

最佳答案

如果你想要紧凑的代码,你可以使用

Map<String, Map<LocalDate, Duration>> newMap = new HashMap<>();
oldMap.forEach((s,o) -> o.forEach((d, i) ->
    newMap.computeIfAbsent(s, x->new HashMap<>()).put(d, Duration.ofSeconds(i))));

如果想避免不必要的散列运算,可以稍微扩展一下

Map<String, Map<LocalDate, Duration>> newMap = new HashMap<>();
oldMap.forEach((s,o) -> {
    Map<LocalDate, Duration> n = new HashMap<>();
    newMap.put(s, n);
    o.forEach((d, i) -> n.put(d, Duration.ofSeconds(i)));
});

关于java - 使用 Java Stream API 将 Map<K, Map<V, X>> 中的类型 X 转换为 Y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44283257/

相关文章:

python - 为什么Python解释器在用作字典键时认为2.0和2是相同的

java - 为每个键打印 map 中列表项的大小

java - 拼写检查 - 带有 Java 流的嘈杂 channel 模型

java - Eclipse插件: OutlineView

java - 将多个图形添加到单个 JPanel

java - 在 IE9 和 IE9 平台预览版中,我无法再从 Java Applet 调用 Javascript 方法

java - 如何使用 JPA 存储库使用同一个表进行联接?

javascript - 将 javascript 映射传递给 json wcf 服务

ios - 如何在 SWIFT 3 中使用带有锯齿状数组(json 数据)的 JSONSerialization.jsonObject

java - 如何在 Java8 中强制立即对流进行评估