java - 将映射转换为 java 8 流中更扁平的结构

标签 java dictionary recursion java-8 java-stream

我有以下代码:

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;
}

上面的代码压平给定的 map

Ex: 
{
  "hello": {
    "hi": {
      "hola": 1
    }
  }
}

to 
{
  "hello.hi.hola": 1
}

我想使用 Java8 流并实现相同的逻辑,我该怎么做?

最佳答案

我本来打算发布类似于 @John Bollinger's answer 的内容。相反,我将使用 StreamEx 提供一个更干净的版本。 :

static Map<String, Object> flatten(Map<?, ?> map) {
    return flatten("", map)
            .mapKeys(k -> k.substring(1))
            .toMap();
}

static EntryStream<String, Object> flatten(String key, Object value) {
    if (value instanceof Map) {
        return EntryStream.of((Map<?, ?>)value)
                .flatMapKeyValue((k, v) -> flatten(key + "." + k, v))
                .chain(EntryStream::of);
    } else {
        return EntryStream.of(key, value);
    }
}

关于java - 将映射转换为 java 8 流中更扁平的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51678379/

相关文章:

java - 使用 tomcat 6.0 和 java 1.6 配置 commons DBCP

python - 在 Python 中优先使用字典而不是对象

java - 递归方法将字符串中的每个字母向后打印 3 次

任何人都可以解释以下 c 代码的输出

java - 部署到 tomcat 后出现 Jersey 错误,在 Eclipse 中工作正常

java - GC_EXTERNAL_ALLOC 和 GC_FOR_MALLOC 日志消息每秒生成一次

java - SimpleDateFormat 不可解析的日期异常

C++ Map基于变量键返回类对象

python - 从字典创建 1 行数据框,包含三列并将变量附加到第一列

c - 在递归函数中使用 libpcre