Java 使用指定的键合并嵌套映射

Java 使用指定的键合并嵌套映射,java,java-stream,Java,Java Stream,我有一张地图,如下所示 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&qu

我有一张
地图
,如下所示

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);
 private static Map<String, String> getFormats(String project) {
    Map<String, String> baseProjFormats = dateFormatsMap.get("P1");
    Map<String, String> currentProjFormats = dateFormatsMap.get(project);

    return Stream.of(baseProjFormats, currentProjFormats)
            .flatMap(e -> e.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (o, n) -> n));
 }
我把这个方法叫做

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}

你可以查一下


我希望,我已经详细说明了这个问题。非常感谢您的帮助。

我找到了解决方案。创建了两个地图,然后按如下所示进行合并

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);
 private static Map<String, String> getFormats(String project) {
    Map<String, String> baseProjFormats = dateFormatsMap.get("P1");
    Map<String, String> currentProjFormats = dateFormatsMap.get(project);

    return Stream.of(baseProjFormats, currentProjFormats)
            .flatMap(e -> e.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (o, n) -> n));
 }
私有静态映射getFormats(字符串项目){
Map baseProjFormats=dateFormatsMap.get(“P1”);
Map currentProjFormats=dateFormatsMap.get(项目);
返回流.of(baseProjFormats、currentProjFormats)
.flatMap(e->e.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,
(o,n)->n);
}

我欢迎任何更好的解决方案。

我得到了解决方案。创建了两个地图,然后按如下所示进行合并

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);
 private static Map<String, String> getFormats(String project) {
    Map<String, String> baseProjFormats = dateFormatsMap.get("P1");
    Map<String, String> currentProjFormats = dateFormatsMap.get(project);

    return Stream.of(baseProjFormats, currentProjFormats)
            .flatMap(e -> e.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (o, n) -> n));
 }
私有静态映射getFormats(字符串项目){
Map baseProjFormats=dateFormatsMap.get(“P1”);
Map currentProjFormats=dateFormatsMap.get(项目);
返回流.of(baseProjFormats、currentProjFormats)
.flatMap(e->e.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,
(o,n)->n);
}

我欢迎任何更好的解决方案。

我添加了默认项目中不在特定项目地图中的所有内容,然后添加了特定项目地图中的所有内容:

 private static Map<String, String> getMyFormats(String project) {
    String defaultProject = "P1";
    Map<String, String> specificMap = dateFormatsMap.get(project);

    Map<String, String> collect = dateFormatsMap.get(defaultProject).entrySet().stream()
               .filter(e -> !specificMap.containsKey(e.getKey()))
               .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));

    collect.putAll(specificMap);
    return collect;
 }

我添加了默认项目中不在特定项目地图中的所有内容,然后添加了特定项目地图中的所有内容:

 private static Map<String, String> getMyFormats(String project) {
    String defaultProject = "P1";
    Map<String, String> specificMap = dateFormatsMap.get(project);

    Map<String, String> collect = dateFormatsMap.get(defaultProject).entrySet().stream()
               .filter(e -> !specificMap.containsKey(e.getKey()))
               .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));

    collect.putAll(specificMap);
    return collect;
 }

我只是想成为一个不使用流的人:

public static void main(String[] args) {
    Map<String, String> defaultMap = Map.of("A", "DD", "B", "MM", "C", "YY");
    Map<String, String> mapToMerge = Map.of("A", "DD-MM", "X", "MM", "C", "YYYY");

    // Do the magic
    Map<String, String> result = new HashMap<String, String>();
    result.putAll(mapToMerge);

    for (Map.Entry<String, String> entry : defaultMap.entrySet())
        if (!result.containsKey(entry.getKey()))
            result.put(entry.getKey(), entry.getValue());

    // Print results
    result.entrySet().stream().forEach(System.out::println);
}
publicstaticvoidmain(字符串[]args){
Map defaultMap=Map.of(“A”、“DD”、“B”、“MM”、“C”、“YY”);
Map mapToMerge=A、DD-MM、X、MM、C、YYYY的地图;
//施展魔法
映射结果=新的HashMap();
结果:putAll(mapToMerge);
对于(Map.Entry:defaultMap.entrySet())
如果(!result.containsKey(entry.getKey()))
put(entry.getKey(),entry.getValue());
//打印结果
result.entrySet().stream().forEach(System.out::println);
}

我将成为一个不使用流的人:

public static void main(String[] args) {
    Map<String, String> defaultMap = Map.of("A", "DD", "B", "MM", "C", "YY");
    Map<String, String> mapToMerge = Map.of("A", "DD-MM", "X", "MM", "C", "YYYY");

    // Do the magic
    Map<String, String> result = new HashMap<String, String>();
    result.putAll(mapToMerge);

    for (Map.Entry<String, String> entry : defaultMap.entrySet())
        if (!result.containsKey(entry.getKey()))
            result.put(entry.getKey(), entry.getValue());

    // Print results
    result.entrySet().stream().forEach(System.out::println);
}
publicstaticvoidmain(字符串[]args){
Map defaultMap=Map.of(“A”、“DD”、“B”、“MM”、“C”、“YY”);
Map mapToMerge=A、DD-MM、X、MM、C、YYYY的地图;
//施展魔法
映射结果=新的HashMap();
结果:putAll(mapToMerge);
对于(Map.Entry:defaultMap.entrySet())
如果(!result.containsKey(entry.getKey()))
put(entry.getKey(),entry.getValue());
//打印结果
result.entrySet().stream().forEach(System.out::println);
}

不使用
s处理此问题的一种方法,您也可以使用
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;
}
私有静态映射getFormats(字符串项目){
Map baseProjFormats=dateFormatsMap.get(“P1”);
Map currentProjFormats=dateFormatsMap.getOrDefault(项目,集合.emptyMap());
baseProjFormats.putAll(currentProjFormats);
返回baseProjFormats;
}

不使用
s处理此问题的一种方法,您也可以使用
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;
}
私有静态映射getFormats(字符串项目){
Map baseProjFormats=dateFormatsMap.get(“P1”);
Map currentProjFormats=dateFormatsMap.getOrDefault(项目,集合.emptyMap());
baseProjFormats.putAll(currentProjFormats);
返回baseProjFormats;
}

这张照片看起来并不比我贴的那张好+感谢你的努力。谢谢。这个看起来并不比我贴的那个好+感谢你的努力。谢谢你。我不明白你现有的解决方案不起作用的部分,但这能起作用吗?作为
项目
提供的输入是什么?在现有的解决方案中,我对整个地图进行流式处理并过滤项目。我用(旧的,新的)来处理重复的。但这种新旧价值观在运行中会有所不同。您可以多次运行我提供的ideone,您将看到不同的结果。我不知道您现有的解决方案在哪里不起作用,但这可以吗?作为
项目
提供的输入是什么?在现有的解决方案中,我对整个地图进行流式处理并过滤项目。我用(旧的,新的)来处理重复的。但这种新旧价值观在运行中会有所不同。您可以多次运行我提供的ideone,您将看到不同的结果。因为OP中使用的
Map.of
返回一个
ImmutableCollections.Map
这会抛出一个
不支持操作异常
。这似乎更好。谢谢。OP中使用的
Map.of
返回一个
ImmutableCollections.Map
这会抛出一个
不支持操作异常
。这似乎好得多。非常感谢。