在Java 8中递归展平嵌套映射的值

Ian2thedv

给定一个Map<String, Object>,其中值是aString或另一个Map<String, Object>,那么如何使用Java 8将地图展平到单个值列表?

例子:

Map - "key1" -> "value1"
    - "key2" -> "value2"
    - "key3" -> Map - "key3.1" -> "value3.1"
                    - "key3.2" -> "value3.2"
                    - "key3.3" -> Map - "key3.3.1" -> "value3.3.1"
                                      - "key3.3.2" -> "value3.3.2" 

对于上面的示例,我想要以下列表:

value1
value2
value3.1
value3.2
value3.3.1
value3.3.2

我知道可以这样做:

public static void main(String args[]) throws Exception {
    //Map with nested maps with nested maps with nested maps with nested......
    Map<String, Object> map = getSomeMapWithNestedMaps();

    List<Object> values = new ArrayList<>();
    addToList(map, values);

    for (Object o:values) {
        System.out.println(o);
    }
}

static void addToList(Map<String, Object>map, List<Object> list) {
    for (Object o:map.values()) {
        if (o instanceof Map) {
            addToList((Map<String, Object>)o, list);
        } else {
            list.add(o);
        }
    }
}

我该如何使用Stream

编辑:

经过一番游戏后,我发现了:

public static void main(String args[]) throws Exception {
    //Map with nested maps with nested maps with nested maps with nested......
    Map<String, Object> map = getSomeMapWithNestedMaps();
    //Recursively flatten maps and print out all values
    List<Object> list= flatten(map.values().stream()).collect(Collectors.toList());
}

static Stream<Object> flatten(Stream<Object> stream) {
    return stream.flatMap((o) ->
        (o instanceof Map) ? flatten(((Map<String, Object>)o).values().stream()) : Stream.of(o)
    );
}
采取模式

您可以定义一个递归方法来展平一个地图并将其用作函数Stream#flatMap或直接调用它使用它。

例子:

public class FlatMap {

    public static Stream<Object> flatten(Object o) {
        if (o instanceof Map<?, ?>) {
            return ((Map<?, ?>) o).values().stream().flatMap(FlatMap::flatten);
        }
        return Stream.of(o);
    }

    public static void main(String[] args) {
        Map<String, Object> map0 = new TreeMap<>();
        map0.put("key1", "value1");
        map0.put("key2", "value2");
        Map<String, Object> map1 = new TreeMap<>();
        map0.put("key3", map1);
        map1.put("key3.1", "value3.1");
        map1.put("key3.2", "value3.2");
        Map<String, Object> map2 = new TreeMap<>();
        map1.put("key3.3", map2);
        map2.put("key3.3.1", "value3.3.1");
        map2.put("key3.3.2", "value3.3.2");

        List<Object> collect = map0.values().stream()
                                            .flatMap(FlatMap::flatten)
                                            .collect(Collectors.toList());
        // or
        List<Object> collect2 = flatten(map0).collect(Collectors.toList());
        System.out.println(collect); 
    }
}

对于给定的嵌套地图,它会打印

[value1,value2,value3.1,value3.2,value3.3.1,value3.3.2]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java 8:按字段对集合进行分组,然后使用流将集合展平并以映射值的形式加入集合?

来自分类常见问题

在Java类中映射嵌套的JSON值

来自分类Dev

Java 8:展平Stream <Stream>

来自分类Dev

如何将嵌套的Java集合中的所有项目展平为单个List?

来自分类Dev

展平Java中第n个嵌套数组的迭代解决方案

来自分类Dev

展平Java中的任何xml记录

来自分类Dev

展平Java中的链接列表

来自分类常见问题

如何在Java 8中映射值?

来自分类Dev

Java 8,匿名递归嵌套方法

来自分类Dev

Clojure-递归展平嵌套地图

来自分类Dev

如何递归展平嵌套字典?

来自分类Dev

Java 8中映射后如何返回可选值

来自分类Dev

Java 8 Streams - 要列表的嵌套映射

来自分类Dev

在 Boost Serialization 中展平嵌套的命名值对

来自分类Dev

如何使用Java手动展平Elasticsearch嵌套的JSON文档?

来自分类Dev

Java 8集合-过滤嵌套列表中的值

来自分类Dev

如何在Clojure中递归展平任意嵌套的矢量和地图?

来自分类Dev

将Java Bean展平到地图

来自分类Dev

如何“展平”或“合并”分布在Java中太多方法中的代码(使用Intellij)?

来自分类Dev

在JavaScript中使用递归展平嵌套数组

来自分类Dev

在Powershell中展平嵌套数组

来自分类Dev

在Jackson中展平嵌套属性

来自分类Dev

在python中展平嵌套结构

来自分类Dev

在Postgres中展平嵌套记录

来自分类Dev

在R中展平嵌套的JSON

来自分类Dev

在Python中展平嵌套列表

来自分类Dev

递归展平数组

来自分类Dev

Arrays.asList在Java中没有展平,我应该怎么用呢?

来自分类Dev

迭代器中的Java 8 Merge映射