I have a two dimensional array of Nodes that I want to flatten into a single array of all nodes using the flatten function of Kotlin arrays.
val nodes = kotlin.Array(width, { width ->
kotlin.Array(height, { height -> Node(width, height) })
})
I then try to call the flatten function on the 2D array
nodes.flatten()
but I get an error: Type mismatch: inferred type is Array<Array<Node>> but Array<Array<out ???>> was expected
. Is there another way I should be doing this?
flatten(): List<T> Returns a single list of all elements from all collections in the given collection.
FlatMap is used to combine all the items of lists into one list. Map is used to transform a list based on certain conditions.
Returns a single list of all elements yielded from results of transform function being invoked on each element of original array. Returns a single list of all elements yielded from results of transform function being invoked on each element of original collection.
Accumulates value starting with the first element and applying operation from left to right to current accumulator value and each element. Throws an exception if this array is empty. If the array can be empty in an expected way, please use reduceOrNull instead.
Use a more universal flatMap
:
nodes.flatMap {it.asIterable()}
Arrays in Kotlin are invariant so an Array<Array<Node>>
is not an Array<Array<out T>>
(which is the receiver type for flatten
).
It looks like this will be fixed in Kotlin 1.1: Relax generic variance in Array.flatten · JetBrains/kotlin@49ea0f5.
Until Kotlin 1.1 is released you can maintain your your own version of 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 }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With