java - 在 java 8 流中将映射转换为更扁平的结构
问题描述
我有以下代码:
private Map<String, Object> flatten(Map<String, Object> source) {
Map<String, Object> result = new LinkedHashMap<>();
source.forEach((k, v) -> {
if (v instanceof Map) {
Map<String, Object> subMap = flatten((Map<String, Object>) v);
for (String subkey : subMap.keySet()) {
result.put(k + "." + subkey, subMap.get(subkey));
}
} else result.put(k, v);
});
return result;
}
上面的代码展平了给定的地图
Ex:
{
"hello": {
"hi": {
"hola": 1
}
}
}
to
{
"hello.hi.hola": 1
}
我想使用 Java8 流并实现相同的逻辑,我该怎么做?
解决方案
不,Stream API 的设计并没有很好地适应递归。使用 Stream API 或重构来“增强”您的解决方案的可能性不大。从其包信息中 Stream API 的定义很明显,它们的使用必须是无干扰的、无状态的且没有副作用- 因此我无法想象你将如何使用这个 API 来实现这一点。
我发现修改内部块的唯一可能用法if-condition
并没有带来真正的好处:
if (v instanceof Map) {
Map<String, Object> subMap = flatten((Map<String, Object>) v);
subMap.keySet().stream().forEach(subkey -> result.put(k + "." + subkey, subMap.get(subkey)));
} else result.put(k, v);
推荐阅读
- bnf - EBNF 到 BNF 转换为表达式的 <<'while'>> ::= while <'Z'> do begin <'A'> { <'A'> } end
- angular - 如何使用带有参数的流来构造 Angular Service 方法以选择一个实体?
- python - Python:如何读取每行都是字符串的 CSV 文件?
- java - 使用 Spring + Thymeleaf 从表中的选定复选框中获取 Id
- vb6 - 获得编译错误:VB6 中未定义子或函数错误
- logging - 如何在 ubuntu 18.04 中管理 /var/log/journal/ 中的文件?
- php - 如何在 WordPress 中将复杂的 JSON 格式转换为可读格式?
- reactjs - 在单击按钮时反应延迟加载动态导入加载组件
- c# - C# WCF gzip 压缩 IIS 无法使 svc/gzip 工作(使用 CloudFlare)
- python - 为什么在使用scrapy的时候会出现这个参数错误?