猿问

从 Map Java 8 中的 Map 获取字符串

您认为在另一张地图内的地图中查找值的最佳方法是什么。


    Map <String, String> map1 = new HashMap<>();


    map1.put("map1|1", "1.1");

    map1.put("map1|2", "1.2");

    map1.put("map1|3", "1.3");

    map1.put("map1|4", "1.4");


    Map <String, String> map2 = new HashMap<>();


    map2.put("map2|1", "2.1");

    map2.put("map2|2", "2.2");

    map2.put("map2|3", "2.3");

    map2.put("map2|4", "2.4");



    Map<String, Map> mapOfMaps = new HashMap<>();


    mapOfMaps.put("MAP|map1", map1);

    mapOfMaps.put("MAP|map2", map2);

现在,如果我需要“MAP|map2”(在mapOfMaps 内)和“map2|3”(在map2 内)的值将是“2.3”


我试图做这样的事情:


System.out.println("x="+getValue(mapOfMaps,"MAP|map2", "map2|4"));


public static String getValue (Map<String, Map> map,String mapfind, String val) {


     Map<Object, Object> mp = map.entrySet().stream()

                .filter(x -> x.getKey().equals(mapfind))

                .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));


     System.out.println("--------"+mp);


     return (String) mp.get(val);

 }

但结果是:


--------{MAP|map2={map2|1=2.1, map2|4=2.4, map2|2=2.2, map2|3=2.3}}

x=null

你能帮我一些想法吗?


holdtom
浏览 340回答 3
3回答

MMTTMM

而不是mapOfMaps通过其原始类型声明它应该被定义为Map<String, Map<String, String>> mapOfMaps = new HashMap<>();相应的getValue方法如下所示:&nbsp; public static String getValue(Map<String, Map<String, String>> mapOfMaps, String mapfind, String val) {&nbsp; &nbsp; Map<String, String> innerMap = mapOfMaps.get(mapfind);&nbsp; &nbsp; return innerMap != null ?&nbsp; &nbsp; &nbsp; innerMap.get(val) :&nbsp; &nbsp; &nbsp; null;&nbsp; }使用Optional我们可以这样写:&nbsp; public static String getValue(Map<String, Map<String, String>> mapOfMaps, String mapfind, String val) {&nbsp; &nbsp; return Optional.ofNullable(mapOfMaps.get(mapfind))&nbsp; &nbsp; &nbsp; .map(m -> m.get(val))&nbsp; &nbsp; &nbsp; .orElse(null);&nbsp; }如果我们继续mapOfMaps通过其原始类型声明,我们将在第一个版本中收到getValue有关未经检查的转换的类型安全警告,而在第二个版本中,我们需要将结果显式转换为String. 由于我们mapOfMaps仅用于将String键映射到String值,因此我们应该相应地声明它。

绝地无双

我认为获得所需输出的最简单方法是使用map.get(mapfind).get(val). 但是如果您想使用现有代码实现它,您可以调用values()收集map和调用过滤器来获得二级过滤器。以下是您修改后的方法的代码片段public static String getValue(Map<String, Map> map, String mapfind, String val) {&nbsp; &nbsp; Map mp = map.entrySet().stream().filter(x -> x.getKey().equals(mapfind))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .values().stream().filter(y -> y.containsKey(val)).findAny().orElse(null);&nbsp; &nbsp; System.out.println("--------" + mp);&nbsp; &nbsp; if (mp == null)&nbsp; &nbsp; &nbsp; &nbsp; return "";&nbsp; &nbsp; return (String) mp.get(val);}

FFIVE

public static String getValue (Map<String, Map> map,String mapfind, String val) {&nbsp; &nbsp; Map childMap = map.get(mapfind);&nbsp; &nbsp; if (childMap == null) {&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }&nbsp; &nbsp; return childMap.containsKey(val) ? childMap.get(val).toString() : null;}
随时随地看视频慕课网APP

相关分类

Java
我要回答