当前位置: 首页 > 知识库问答 >
问题:

如何将嵌套的Java集合中的所有项扁平化到单个列表中?

商茂勋
2023-03-14

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

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

是否存在一个泛型方法来将其平坦化并获得包含在其中的所有对象的单个列表

    null

共有1个答案

谷梁宏恺
2023-03-14

假设您使用Java8,您可以通过Stream API实现这一点,这要归功于方法FlatMap(函数<?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());

stream flatMap(函数<?super T,?extends stream<?extends r>>映射器)

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

对于Java的早期版本,您仍然可以使用Google Guava的FluentIterable替换Stream并使用TransformandConcat(function<?super E,?extends iterable<?extends t>>function)而不是FlatMap来扁平化您的集合。

然后将以前的代码段重写为Next:

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()
        )
    );
 类似资料:
  • 问题内容: 给定对象的复杂嵌套集合,例如: 是否存在通用方法来对此进行平坦化并获取其中包含的所有s中的一个? 一些细节: 该列表不应包含集合对象本身或映射键-仅包含最低级别的值。 它应尽可能遵循相同的顺序-因此在示例中,列表中的各项将是顺序的,而地图/集合的顺序将取决于实现。 它可以选择排除重复项 更新: 理想情况下,它应该在任何级别上检测/处理循环引用,例如,外部List包含其自身作为成员。(感

  • 本文向大家介绍Python中的扁平化嵌套列表迭代器,包括了Python中的扁平化嵌套列表迭代器的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个嵌套的整数列表;我们必须实现一个迭代器以使其扁平化。每个元素可以是整数,也可以是列表。该列表的元素也可以是整数或其他列表。因此,如果输入类似于[[1,1],2,[1,1]],则输出将为[1,1,2,1,1,1] 为了解决这个问题,我们将遵循以下步骤-

  • 注意:这个问题被简单地标记为这个问题的重复,但它不是完全的重复,因为我是专门询问std::optionals的。如果你关心一般情况,还是一个很好的问题。 假设我有嵌套的选项,如下所示(愚蠢的玩具示例): 还有这个垃圾邮件功能: 什么是压扁这张可选支票的最佳方法?我做了这样的东西,它不是可变的,但我不太关心这个(如果真的需要,我可以再添加一个级别(用),而且超出这个级别的所有东西都是可怕的代码)。

  • 问题内容: 我有一个这样的清单: 此列表中的每个项目可能包含一个数据对或一个元组,我想将此列表更改为 然后这样做: 我不知道如何更改列表结构,或者如何基于原始列表进行相同的计算? 问题答案: 如果您只想整理列表,请使用:http : //docs.python.org/library/itertools.html#itertools.chain.from_iterable