在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()}