为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2021-09-03 21:33:57
您认为在另一张地图内的地图中查找值的最佳方法是什么。    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你能帮我一些想法吗?
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

而不是mapOfMaps通过其原始类型声明它应该被定义为


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

相应的getValue方法如下所示:


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

    Map<String, String> innerMap = mapOfMaps.get(mapfind);

    return innerMap != null ?

      innerMap.get(val) :

      null;

  }

使用Optional我们可以这样写:


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

    return Optional.ofNullable(mapOfMaps.get(mapfind))

      .map(m -> m.get(val))

      .orElse(null);

  }

如果我们继续mapOfMaps通过其原始类型声明,我们将在第一个版本中收到getValue有关未经检查的转换的类型安全警告,而在第二个版本中,我们需要将结果显式转换为String. 由于我们mapOfMaps仅用于将String键映射到String值,因此我们应该相应地声明它。


查看完整回答
反对 回复 2021-09-03
?
绝地无双

TA贡献1946条经验 获得超4个赞

我认为获得所需输出的最简单方法是使用map.get(mapfind).get(val). 但是如果您想使用现有代码实现它,您可以调用values()收集map和调用过滤器来获得二级过滤器。以下是您修改后的方法的代码片段


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

    Map mp = map.entrySet().stream().filter(x -> x.getKey().equals(mapfind))

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


            .values().stream().filter(y -> y.containsKey(val)).findAny().orElse(null);


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

    if (mp == null)

        return "";

    return (String) mp.get(val);

}


查看完整回答
反对 回复 2021-09-03
?
FFIVE

TA贡献1797条经验 获得超6个赞

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

    Map childMap = map.get(mapfind);

    if (childMap == null) {

        return null;

    }

    return childMap.containsKey(val) ? childMap.get(val).toString() : null;

}


查看完整回答
反对 回复 2021-09-03
  • 3 回答
  • 0 关注
  • 339 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信