【问题标题】:How to get the value from List of Map values in java and handle when it is not presentjava - 如何从Java中的Map值列表中获取值并在它不存在时进行处理
【发布时间】:2020-03-20 15:34:40
【问题描述】:

我想迭代一个地图列表并检查代码是否“approved”然后添加“id”和“date”进入另一个地图。而且我的场景有时代码不会作为我的地图列表的一部分(例如 Record 1 - 我只有第二个元素的 code,我已经只有 iddate 在我的第一个元素中,而 Record -2 将在所有元素中包含“code” )

这是我的代码

List<Map<String, Object>> prodIds = ((List<Map<String, Object>>) myIds.get("result"));

//这个 prodIds 在我的 java 代码中返回如下:

记录 1:

[{id=[14766724], Date=[1999-01-01]}, {id=[49295837], code=[approved], Date=[2003-04-01]}]

记录 2:

[{id=[58761474621], code=[approved], Date=[2017-09-30]}, {id=[3368781], code=[Cancelled], Date=[2014-01-01]}, {id=[48843224], code=[Cancelled], Date=[2009-01-01]}]

Java 代码

List<Map<String, Object>> prodIds = ((List<Map<String, Object>>) myIds.get("result"));
System.out.println("prodIds : " +prodIds ); //  [{id=[14766724], Date=[1999-01-01]}, {id=[49295837], code=[approved], Date=[2003-04-01]}]

Map<String, String> newMap = new HashMap<>();
    for (Map<String, Object> map : prodIds) { 
        for (Map.Entry<String, Object> entry : map.entrySet()) { 
            String key = entry.getKey();
            System.out.println("Key : " +key);

            String value = (String) entry.getValue();
             System.out.println(" Value : " +value);
        }
    }

我很难在 newMap 中将键添加为“id”并将值添加为“Date”,我想要为代码值“approved”添加“id”和“date

怎么做?

【问题讨论】:

    标签: java list hashmap


    【解决方案1】:

    你只需要一个简单的 null 和空检查

    for (Map<String, Object> s : prodIds) { 
    
       List<String> status = (List<String>) s.get("code");
    
          if(status!=null && !status.isEmpty()) {
    
             System.out.println("status value: " +status.get(0));
          }else {
            //some default value or do something 
    
           }
    
     }
    

    【讨论】:

    • 我不能这样使用 - List status = (String) ((List) s.get("code"));我收到编译错误,指出无法从列表转换为字符串。类型不匹配:无法从 String 转换为 List
    • 感谢@Deadpool,但这种情况失败了 [{id=[147625], Date=[1999-01-01]}, {id=[492956837], code=[approved], Date= [2003-04-01]}]。我总是为 s.get("code") 获得空值,因为我猜“code”在索引 1 中 - 如果代码在索引 0 中可用,那么我猜上述逻辑工作。我的意思是这样的 [{id=[147625], code=[approved], Date=[1999-01-01]}, {id=[492956837], Date=[2003-04-01]}]跨度>
    【解决方案2】:

    这应该找到所有被批准的项目并输出日期(假设你的代码值是一个字符串):

    prodIds.stream()
            .filter(m -> m.get("code") != null && m.get("code").equals("approved"))
            .map(m -> m.get("Date"))
            .forEach(System.out::println);
    

    【讨论】:

    • 感谢 Ryan,我尝试了这种方法,但没有打印出来 :(
    • 它在我的测试中有效,所以你可能有一些区分大小写的问题。如果“已批准”实际上是一个枚举,则需要更正。
    • 嗨 Ryan - 我更新了我的帖子,如果代码获得批准,我正在新地图中查看 ID 和日期。你能帮我解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2016-09-06
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多