给定对象的复杂嵌套集合,如:
Set<List<Map<String, List<Object>>>> complexNestedCollection;
是否存在一个泛型方法来将其平坦化并获得包含在其中的所有对象
的单个列表
?
假设您使用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());
返回一个流,该流由将此流的每个元素替换为映射流的内容的结果组成,该映射流是通过将提供的映射函数应用于每个元素而产生的。每个映射的流在其内容被放入该流后将被关闭。(如果映射流为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