java - 使用指定键合并嵌套 map

标签 java java-stream

我有一个Map如下

Map<String, Map<String, String>> dateFormatsMap;

Map<String,String> m1 = Map.of("A","DD", "B", "MM", "C","YY");
Map<String,String> m2 = Map.of("A","DD-MM", "X", "MM", "C","YYYY");
Map<String,String> m3 = Map.of("X","DD", "Y", "MM", "C","YY");

dateFormatsMap = Map.of("P2",m2,"P1",m1, "p3",m3);
该图是从DB填充的,具有按项目分类的数据。
我想要的是将特定项目和一个默认项目的Map合并,如果有重复,则合并,我想保留指定项目的值。
我尝试下面的代码,
private static Map<String, String> getFormats(String project) {
    Set<String> projects = Set.of("P1", project);   //e.g "P1" as default project
    return dateFormatsMap.entrySet().stream()
            .filter(e->projects.contains(e.getKey()))
            .flatMap(e->e.getValue().entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (o,n)->o));
} 
我称这种方法为
getFormats("P2");
但这给出了变化的结果,其值有时来自“P1”,有时来自“P1”。

{A = DD,B = MM,C = YY,X = MM}
{A = DD-MM,B = MM,C = YYYY,X = MM}

我需要有一个固定的结果,

{A = DD-MM,B = MM,C = YYYY,X = MM}

您可以检查ideone
希望我已经详细说明了这个问题。感谢您的帮助。

最佳答案

一种无需使用Stream即可解决此问题的方法,您也可以尝试使用putAll-

private static Map<String, String> getFormats(String project) {
    Map<String, String> baseProjFormats = dateFormatsMap.get("P1");
    Map<String, String> currentProjFormats = dateFormatsMap.getOrDefault(project, Collections.emptyMap());
    baseProjFormats.putAll(currentProjFormats);
    return baseProjFormats;
}

关于java - 使用指定键合并嵌套 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61820685/

相关文章:

Java8 : Map list of objects by key

java - 如何从两个列表中排除非单个项目?

java - 检查数组中的对象属性

来自 scala 代码的 Java 8 Stream

java - 禁用 Swing 中 GUI 上的按钮

java - 这句话是什么意思

java - 并行流中的异常详细信息不一致

java - Java groupingBy 收集器是否保留列表顺序?

java - java long 的算术问题

java - Android TextView中的阿拉伯日期显示