java - ClasscastException 合并两个 LinkedHashMap

标签 java java-8 java-stream

我正在尝试合并两个 LinkedHashMap.. 我的规则是,如果两个映射的键中有重复项......那么第二个映射的值应优先并覆盖第一个映射。

这是我的代码:

import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamMerge {
    public static void main(String[] args) {
        LinkedHashMap<String, Object> m1 = new LinkedHashMap<String, Object>();
        m1.put("A", "1");
        m1.put("B", "2");
        m1.put("C", "3");
        LinkedHashMap<String, Object> embeddedMap =  new LinkedHashMap<String, Object>();
        embeddedMap.put("D", "10");
        embeddedMap.put("E", "20");
        m1.put("embed", embeddedMap);


        LinkedHashMap<String, Object> m2 = new LinkedHashMap<String, Object>();
        m2.put("A", "1");
        m2.put("B", "2");
        m2.put("C", "4");
        LinkedHashMap<String, Object> embeddedMap2 =  new LinkedHashMap<String, Object>();
        embeddedMap2.put("D", "10");
        embeddedMap2.put("E", "20");
        m2.put("embed", embeddedMap2);
        m2.put("F", "100");

        LinkedHashMap<String, Object> finalMap = (LinkedHashMap<String, Object>)Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
            .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue(), (map1, map2) -> {
                System.out.println("m1" + m1.getClass());
                System.out.println("m2" + m2.getClass());
                return map2;
            }));
        System.out.println(finalMap);
    }
}

我的问题是,当我尝试运行它时..我收到此异常。

Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap
    at com.oracle.lambda.StreamMerge.main(StreamMerge.java:36)
m1class java.util.LinkedHashMap
m2class java.util.LinkedHashMap
m1class java.util.LinkedHashMap
m2class java.util.LinkedHashMap
m1class java.util.LinkedHashMap
m2class java.util.LinkedHashMap
m1class java.util.LinkedHashMap
m2class java.util.LinkedHashMap

我正在做的解决方法是将其转换为 HashMap

HashMap<String, Object> finalMap = (HashMap<String, Object>)Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
    .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue(), (map1, map2) -> {
        System.out.println("m1" + m1.getClass());
        System.out.println("m2" + m2.getClass());
        return map2;
    }));
System.out.println(finalMap);

但是顺序变得困惑,因为它现在是一个 HashMap..“F”应该在最后。

{A=1, B=2, C=4, F=100, embed={D=10, E=20}}

我的代码有问题吗?

最佳答案

Collectors.toMap() 不需要返回 Map 接口(interface)的任何特定实现。它当前返回一个 HashMap,但这只是一个实现细节。

您可以通过调用不同的变体来强制它返回 LinkedHashMap:

LinkedHashMap<String, Object> finalMap = 
    Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
          .collect(Collectors.toMap(entry -> entry.getKey(),
                                    entry -> entry.getValue(),
                                    (v1, v2) -> v2,
                                    LinkedHashMap::new));

输出Map将打印为:

{A=1, B=2, C=4, embed={D=10, E=20}, F=100}

关于java - ClasscastException 合并两个 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199974/

相关文章:

java - Spring 模块中的 CacheSecond

java - Hikari连接池启动后创建两个连接

java - Jface 中的选项对话框

java - Java 8+ 如何将方法引用推断为消费者?

java - 使用现有声音输入在Java中为Windows创建麦克风

java - hibernate 和 Spring : EntityManager is Null

java - 使用 Java 8 谓词改进代码 - 比较多个参数

java-8 - 在 map 上过滤

java - 使用流时 Map.Entry 方法的 Eclipse Mars 错误?

java - 在树结构上创建深度流