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

史蒂夫·钱伯斯

给定对象的复杂嵌套集合,例如:

Set<List<Map<String, List<Object>>>> complexNestedCollection;

是否存在通用方法来对此进行平坦化并获取其中包含List的所有Objects中的一个?

一些细节:

  1. 该列表不应包含集合对象本身或映射键-仅应包含最低级别的值。
  2. 在可能的情况下,它应该遵循相同的顺序-因此在示例中,列表中的项目将是顺序的,而地图/集合的顺序将取决于实现。
  3. 它可以选择排除重复项
  4. 更新:理想情况下,它应该在任何级别上检测/处理循环引用,例如List<List<Object>>,外部List包含其自身作为成员。(感谢AdrianJałoszewski在下面的评论中提及此内容)。

注意:实际用例是从中获取所有String List<List<String>>,这可以通过两个循环轻松完成,但是这让我对一般情况感到疑惑。

尼古拉斯·菲洛托(Nicolas Filotto)

假设您使用Java 8,那么可以Stream API通过以下方法flatMap(Function<? super T,? extends Stream<? extends R>> mapper)来实现:

// 1. Convert the Set as a Stream of List<Map<String, List<Object>>>
// 2. Extract the elements of the lists to get a Stream of Map<String, List<Object>>
// 3. Extract values of the maps to get a Stream of List<Object>
// 4. Extract the elements of the lists to get a Stream of Object
// 5. Get rid of duplicates
// 6. Collect the result as a List of Object
List<Object> result = complexNestedCollection.stream()
    .flatMap(List::stream)
    .flatMap(m -> m.values().stream())
    .flatMap(List::stream)
    .distinct()
    .collect(Collectors.toList());

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

返回一个流,该流包括将流中的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容而得到的结果。将每个映射流的内容放入此流后,将其关闭。(如果映射的流为null,则使用空流。)


对于以前的版本Java,你仍然可以使用FluentIterable谷歌番石榴更换Stream和使用transformAndConcat(Function<? super E,? extends Iterable<? extends T>> function),而不是flatMap扁平化您的收藏。

然后,先前的代码段将被重写为下一个:

List<Object> result =
    new ArrayList<>(
        new LinkedHashSet<>(
            FluentIterable.from(complexNestedCollection)
                .transformAndConcat(
                    new Function<List<Map<String, List<Object>>>, Iterable<Map<String, List<Object>>>> () {
                        public Iterable<Map<String, List<Object>>> apply(final List<Map<String, List<Object>>> input) {
                            return input;
                        }
                    }
                ).transformAndConcat(
                    new Function<Map<String, List<Object>>, Iterable<List<Object>>> () {
                        public Iterable<List<Object>> apply(final Map<String, List<Object>> input) {
                            return input.values();
                        }
                    }
                ).transformAndConcat(
                    new Function<List<Object>, Iterable<Object>> () {
                        public Iterable<Object> apply(final List<Object> input) {
                            return input;
                        }
                    }
                ).toList()
        )
    );

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用lodash将集合中的所有项目深层展平

来自分类Dev

如何将 JSON 中的数组展平为 Pandas

来自分类Dev

如何将groovy项目(所有类的日志)中的日志记录设置为单个文件

来自分类Dev

如何使用JSONata将嵌套对象展平为单个深度对象?

来自分类Dev

我可以将List <object>展平为具有每个项目属性的匿名对象吗?

来自分类Dev

将具有不均匀或缺失行的嵌套命名列表转换并展平为R中的单个数据框

来自分类Dev

将具有不均匀或缺失行的嵌套命名列表转换并展平为R中的单个数据框

来自分类Dev

如何将嵌套的JSON展平到pandas数据框中

来自分类Dev

Python-如何将嵌套字典的所有值作为单个List [dict]获得?

来自分类Dev

使用Knockout.js将具有嵌套数组的JS对象展平为单个HTML表行

来自分类Dev

使用Knockout.js将具有嵌套数组的JS对象展平为单个HTML表行

来自分类Dev

如何将元组列表展平为pythonic列表

来自分类Dev

如何将行展平为列(字段)值

来自分类Dev

如何将JSON数组展平为csv文件

来自分类Dev

PostgreSQL:如何将表列展平为文本[]

来自分类Dev

如何从集合中获取所有嵌套项目?

来自分类Dev

如何将树中的所有npm依赖项解析为单个版本

来自分类Dev

数据透视表如何将筛选器中的所有项目设置为false?

来自分类Dev

数据透视表如何将筛选器中的所有项目设置为false?

来自分类Dev

如何将字符串作为单个项目放入集合中?

来自分类Dev

如何将包含嵌套数组的压缩对象展平到列表?

来自分类Dev

有什么方法可以将多个嵌套的create foreach循环展平为批量创建/插入?

来自分类Dev

将范围列表展平为单个结果范围集

来自分类Dev

如何将包含所有嵌套数据的Firebase文档移动到其他集合?

来自分类Dev

将pyspark中的嵌套数据框展平为列

来自分类Dev

将列表列表展平到集合中,但scala中有例外

来自分类Dev

将嵌套列表展平为1深列表

来自分类Dev

将嵌套字典展平为key:value对的列表

来自分类Dev

将嵌套列表展平为1个深度列表

Related 相关文章

  1. 1

    使用lodash将集合中的所有项目深层展平

  2. 2

    如何将 JSON 中的数组展平为 Pandas

  3. 3

    如何将groovy项目(所有类的日志)中的日志记录设置为单个文件

  4. 4

    如何使用JSONata将嵌套对象展平为单个深度对象?

  5. 5

    我可以将List <object>展平为具有每个项目属性的匿名对象吗?

  6. 6

    将具有不均匀或缺失行的嵌套命名列表转换并展平为R中的单个数据框

  7. 7

    将具有不均匀或缺失行的嵌套命名列表转换并展平为R中的单个数据框

  8. 8

    如何将嵌套的JSON展平到pandas数据框中

  9. 9

    Python-如何将嵌套字典的所有值作为单个List [dict]获得?

  10. 10

    使用Knockout.js将具有嵌套数组的JS对象展平为单个HTML表行

  11. 11

    使用Knockout.js将具有嵌套数组的JS对象展平为单个HTML表行

  12. 12

    如何将元组列表展平为pythonic列表

  13. 13

    如何将行展平为列(字段)值

  14. 14

    如何将JSON数组展平为csv文件

  15. 15

    PostgreSQL:如何将表列展平为文本[]

  16. 16

    如何从集合中获取所有嵌套项目?

  17. 17

    如何将树中的所有npm依赖项解析为单个版本

  18. 18

    数据透视表如何将筛选器中的所有项目设置为false?

  19. 19

    数据透视表如何将筛选器中的所有项目设置为false?

  20. 20

    如何将字符串作为单个项目放入集合中?

  21. 21

    如何将包含嵌套数组的压缩对象展平到列表?

  22. 22

    有什么方法可以将多个嵌套的create foreach循环展平为批量创建/插入?

  23. 23

    将范围列表展平为单个结果范围集

  24. 24

    如何将包含所有嵌套数据的Firebase文档移动到其他集合?

  25. 25

    将pyspark中的嵌套数据框展平为列

  26. 26

    将列表列表展平到集合中,但scala中有例外

  27. 27

    将嵌套列表展平为1深列表

  28. 28

    将嵌套字典展平为key:value对的列表

  29. 29

    将嵌套列表展平为1个深度列表

热门标签

归档