看到了flatten
,我正在寻找一些东西,它将是一个deepFlatten
,即它将不仅适用于Iterable<Iterable<T>>
(对于Array
来说基本相同,但为了简洁起见,现在让我们专注于Iterable
),还适用于Iterable<Iterable<Iterable<T>>>
,Iterable<Iterable<Iterable<Iterable<T>>>>
等等......
当然,结果必须是List<T>
,标准的flatten()
无法提供这种结果 - 它会返回List<Iterable<T>
(或带有更多嵌套Iterable
的List
)。
我试图使用reified
泛型:
inline fun <reified E, T> Iterable<E>.deepFlatten(): List<T> = when(E::class) {
Iterable<*>::class -> (this as Iterable<Iterable<*>>).flatten().deepFlatten()
else -> flatten()
}
但是,这显然存在许多错误:
T
似乎相当难以推断- 你不能有一个接口的
::class
- 你不能对一个
inline
函数进行递归调用
那么,上述问题是否有任何解决方法?或者,更好的办法是什么?
为了完整起见,我想演示一个示例:
fun main() {
val data: List<List<List<Int>>> = listOf(
listOf(listOf(1, 2, 3), listOf(5, 6), listOf(7)),
listOf(listOf(8, 9), listOf(10, 11, 12, 13))
)
print(data.deepFlatten()) // 1 2 3 4 5 6 7 8 9 10 11 12 13
}
嵌套的
Iterable
深度可能会有所不同,它们不必是相同类型 - 重要的是它们是通用的Iterable
。
Int
?到处抛出Object
看起来有点不对劲,尤其是我们已经有了泛型。 - FureeishSequence
而不是普通 Java 的Stream
。 - Fureeish