首页 > 解决方案 > 使用 Java Stream API 按其值过滤地图

问题描述

我是 Java 流的新手,想使用流运行以下代码。

 List<String> roles = new ArrayList<>();
    if (stats.containsKey("roles")) {
            roles = stats.get("roles");
    } else {
            Map<String, String> roleMap = stats.containsKey("attributes") ? 
                       stats.get("attributes") : new HashMap<>();
            for (Map.Entry<String, String> e : roleMap.entrySet()) {
                    if (e.getValue().equals("true")) {
                            roles.add(e.getKey());
                    }
            }
    }

在上面的代码中,我正在执行以下步骤:

  1. 我有一个stats哈希图,首先我检查roles键是否存在,如果存在,我将返回相应的值。

  2. 如果statshashmap 不包含roleskey,我正在检查statshashmap 是否包含 key attributes

  3. 如果attribute键存在,那么它的值是 Hashmap,然后我遍历 hashmap 并检查它的值等于“true”的地方,我将相应的键添加到我的roles列表中。

输入:

{
    "attributes":{
        "id":false
        "name":true
    }
       
}

输出:

["name"]

整个代码可以通过流减少吗?

标签: javajava-stream

解决方案


 stats.keySet().stream().filter(s->s.equals("roles")).findFirst().map(s->stats.get("roles")).orElseGet(()->{
        List list=  Lists.newArrayList();
        stats.get("attributes").foreach((k,v)->{
             if v;list.add(k)
         })
       return list;
    })

推荐阅读