Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ClasscastException合并两个LinkedHashMap_Java_Java 8_Java Stream - Fatal编程技术网

Java ClasscastException合并两个LinkedHashMap

Java ClasscastException合并两个LinkedHashMap,java,java-8,java-stream,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 St

我正在尝试合并两个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);
    }
}
我正在做的解决方法是将其转换为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);
我的代码中是否有错误?

收集器。不需要toMap()
返回
映射
接口的任何特定实现。它当前返回一个
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));

聪明的朋友…我很快就明白了…只要我再看一行API。谢谢。您正在使用一种复杂的方式来执行
m1.putAll(m2)
或者,如果您需要一个新映射,
finalMap=newlinkedhashmap(m1);最终地图putAll(m2)
{A=1, B=2, C=4, F=100, embed={D=10, E=20}}
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));
{A=1, B=2, C=4, embed={D=10, E=20}, F=100}