【发布时间】:2011-11-17 20:42:18
【问题描述】:
我想扁平化 Java 中某种类型 T 的任意深度嵌套的集合/结构,最好使用
- 只有实时视图而不是复制的集合;
- 不仅处理集合,还处理迭代器、任意维度的 T 数组、Iterable 以及所有这些任意混合和嵌套的结构;
- 静态类型安全。
有没有可以处理这个的java库?
Guava 似乎只处理一个嵌套级别,即Collection<Collection<T>> --flatten--> Collection<T>。
lambdaj 看起来很有希望:我能以某种方式结合on()、asIterator() 和flattenIterator() 来实现这一目标吗?以静态类型安全的方式?
【问题讨论】:
-
不是基于上述任何一个,但可能是一个
DeepIterator类,该类由Collection构造,其next()方法查看下一个Object,如果它是 @987654332 @ 然后将当前的iterator推送到Stack并递归到Collection的迭代器中。 -
是的,我已经以这种方式实现了一些迭代器。不过,必须对任意维度的数组和迭代器进行区分是非常繁琐的。并且没有静态类型安全:(由于 lambdaj 可能至少实现它一样好,我认为我不应该这样做......
-
这里的静态类型安全是什么意思?由于Collection(实际上是ADG)可以包含不同类型的元素,Iterator 只能提供
Objects。我错过了什么吗? -
至少对于所有任意深度嵌套的集合,您可以在编译时检测到叶子都是 T 类型。由于 lambdaj 提供了许多感觉是动态类型的函数(例如,在每个项目上调用一个方法),但实际上仍然是静态类型的,我希望 lambdaj 可以在编译时处理更多的结构和检查。
-
DeepIterator方法听起来很有希望,但我认为您无法实现通用和静态的类型安全解决方案。我看不出你怎么能用 Java 表达这样的实体。
标签: java generics collections type-safety lambdaj