【发布时间】:2020-11-16 07:04:51
【问题描述】:
看到flatten,我一直在寻找deepFlatten,也就是说,它不仅适用于Iterable<Iterable<T>>(Arrays 几乎相同,但让我们关注@ 987654326@ 现在为简洁起见),还有Iterable<Iterable<Iterable<T>>>、Iterable<Iterable<Iterable<Iterable<T>>>> 等等...
当然,结果必须是List<T>,这是标准flatten() 不提供的——它会返回List<Iterable<T>(或带有更多嵌套Iterables 的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
}
嵌套 Iterables 的深度(它们不必是同一类型 - 重要的是它们通常是 Iterable)可以变化。
【问题讨论】:
标签: kotlin generics recursion flatten kotlin-reified-type-parameters