java - 通过 Stream 过滤操作并维护为 map 而不是 Stream
问题描述
我目前正在从外部 api 调用中获取地图数据。
我想确保数据不为空或为空,并
通过过滤到地图中的特定键并将结果捕获到另一个对象中来对其执行一组操作。
密钥本身以逗号分隔。
地图中的示例键/值。
"key1,key2,key3,id100" : {
"val1: "",
"val2: "",
"val3: "",
... others
}
我正在过滤以捕获此键下的所有值(因此数据 cal1、val2、val3 等),然后执行一些操作。
但是当我执行如图所示的过滤器时,我最终得到了一个流。
因此,我最终得到的不仅仅是Map<String, Object> ,而是Stream<Map.Entry<String, Object>>。
尝试过平面图并出现以下错误:
不存在类型变量 U 的实例,因此 Stream<Entry<String, Object>> 符合 Optional
如何将其从 Stream 转换回 Map 或更好的过滤方式?谢谢。
本来可以通过没有 Streams 的 for 循环完成此操作,但尝试查看如何
在 Stream 实现中实现此目的,因此无需寻找 for 循环解决方案。请指教。谢谢。
private NewObject get() {
Map<String, Object> data = // data filled in by an external rest call;
return Optional.ofNullable(data)
// using flatmap here throws above error
.map(Map::entrySet)
.map(entries -> entries.stream()
.filter(entry -> entry.getKey().contains("id100))
// I wish to carry on further operations from here by using the filtered map.
// having issues cos capturedData is a Stream
// even if using flatmap at this stage, capturedData is still a Stream.
// wanting to do the following but can't due to it being a Stream and not a map
).map(capturedData -> {
Map<String, Object> at = (Map<String, Object>) capturedData;
NewObject newObject = new NewObject();
newObject.setName((String) at.get("val1"));
return newObject;
}).orElse(null);
}
解决方案
用于map
构造NewObject
和用于findFirst
获取第一个值(根据您的评论,只有一个条目的键具有 substring id100
)。最后使用flatMap
解包Optional<NewObject>
。
return Optional.ofNullable(data)
.map(Map::entrySet)
.flatMap(entries -> entries.stream()
.filter(entry -> entry.getKey().contains("id100"))
.map(entry -> {
NewObject newObject = new NewObject();
Map<String, String> nestedMap = (Map<String, String>) entry.getValue();
newObject.setName(nestedMap.get("val1"));
return newObject;
})
.findFirst())
.orElse(null);
推荐阅读
- textfield - 用户点击字段时如何将 textFieldStyle 切换为 TextField?
- api - 使用 Grafana API 进行自动身份验证
- google-chrome - Chrome 的 CORS 问题
- glue42 - 如何用自定义应用程序替换默认的 Glue42 工具栏?
- mysql - 物理写入文件已满 - mysql错误
- php - 如何显示从以下代码的输入文本字段中获得的值?
- cypress - 如何访问 Cypress.json 中的嵌套值
- mysql - sql语句中有多个where子句?
- php - 生产上的 CSS 与本地不同 - Laravel
- javascript - 如何在 CSS 的自定义卡片组件中将图标与左边框对齐?