在Kotlin拼合数组
我有一个节点的二维数组,我想使用Kotlin数组的flatten函数将其平铺到所有节点的单个数组中。
val nodes = kotlin.Array(width, { width -> kotlin.Array(height, { height -> Node(width, height) }) })
然后我尝试调用二维数组上的扁平函数
nodes.flatten()
但我得到一个错误: Type mismatch: inferred type is Array<Array<Node>> but Array<Array<out ???>> was expected
。 还有另一种方法我应该这样做?
Kotlin中的Array<Array<Node>>
是不变的,所以Array<Array<Node>>
不是Array<Array<out T>>
(这是flatten
的接收器类型)。
看起来这将在Kotlin 1.1中得到解决: 在Array.flatten·JetBrains / kotlin @ 49ea0f5中放松通用差异 。
在Kotlin 1.1发布之前,你可以维护你自己的flatten
版本:
/** * Returns a single list of all elements from all arrays in the given array. */ fun <T> Array<out Array<out T>>.flatten(): List<T> { val result = ArrayList<T>(sumBy { it.size }) for (element in this) { result.addAll(element) } return result }
使用更通用的flatMap
:
nodes.flatMap {it.asIterable()}