Kotlin flatmap для распаковки Список данных класса - PullRequest
2 голосов
/ 01 декабря 2019

Имеется список двумерных координат , которые представляют собой класс данных

data class Point(val x: Int, val y:Int)
val points: List<Point>

и метод TornadoFX (JavaFX in Kotlin), который принимает уплощенный массив [x, y, x2, y2 ...]:

polyline(vararg points: kotlin.Number)

Я просто написал следующее и ушел, чувствуя, что этого не может быть все, что есть

fun List<Point>.asPolyline() = this.flatMap { p -> listOf(p.component1(), p.component2()) }

polyline(*points.asPolyline().toTypedArray())

Нет ли способа расширитькласс данных (аналогично тому, как Array распространяется с этим *) или просто лучший способ сделать это преобразование?

Ответы [ 2 ]

1 голос
/ 01 декабря 2019

Вот способ сделать это с минимальными выделениями:

fun List<Point>.toFlatArray() = 
    Array(size * 2) { with (this[it / 2]) { if (it % 2 == 0) x else y } }
1 голос
/ 01 декабря 2019

Я не могу найти существенно другой способ сделать это, но я думаю, что если мы используем fold и MutableList, это можно сделать без выделения List для каждого Point:

fun List<Point>.asPolyline(): List<Number> = this.fold(mutableListOf()) { next, carry -> 
    next.apply {
        this.add(carry.x)
        this.add(carry.y)
    }
}
...