java - 使用 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());
}
}
}
在上面的代码中,我正在执行以下步骤:
我有一个
stats
哈希图,首先我检查roles
键是否存在,如果存在,我将返回相应的值。如果
stats
hashmap 不包含roles
key,我正在检查stats
hashmap 是否包含 keyattributes
。如果
attribute
键存在,那么它的值是 Hashmap,然后我遍历 hashmap 并检查它的值等于“true”的地方,我将相应的键添加到我的roles
列表中。
输入:
{
"attributes":{
"id":false
"name":true
}
}
输出:
["name"]
整个代码可以通过流减少吗?
解决方案
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;
})
推荐阅读
- sql - POSTGRESQL 限制给定条件的结果查询
- reactjs - 为 cookie 管理创建单独的反应组件
- javascript - 检查值等于数组中的特定值 - javascript
- ms-word - 通过 VBA 更新 WORD 2016 中图片的多个源链接
- excel - Excel VBA:如何在同一列中交换两个选定的单元格范围(不仅仅是两个值)?
- facebook - 从“自己的”Facebook 页面的时间线中阅读公开帖子 - Pages API 需要审核和业务验证
- google-chrome - 谷歌浏览器对 URL 中“#”的新处理将如何影响我的 OpenUI5 应用程序?
- hyperledger-fabric - 从没有互联网连接的机器运行“composer network upgrade”时出现“RESOURCE_EXHAUSTED”错误
- php - PHP:将字符串转换为数组
- c# - 检索 XSD 中可选元素的默认值