Я пытаюсь объединить два LinkedHashMap ..
Мое правило состоит в том, что если в ключе для обеих карт есть дубликаты .. тогда значения 2-й карты должны преобладать и переопределять 1-ю карту.
Вот мой код:
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}}
Что-то не так в моем коде?