Kotlin和详细的数组实例化

Tom*_*son 5 arrays syntax kotlin

假设我有通过4个顶点的路径.在进行快速原型设计时,我会在java中定义它

double[][] path = {{1.0, 2.0}, {1.0,3.0}, {3.0,4.0}, {8.0,9.0}}
Run Code Online (Sandbox Code Playgroud)

使用arrayOf和doubleArrayOf函数,Kotlin中的代码相同

val path = arrayOf(doubleArrayOf(1.0, 2.0), doubleArrayOf(1.0, 2.0), doubleArrayOf(1.0,3.0), doubleArrayOf(8.0,9.0))
Run Code Online (Sandbox Code Playgroud)

感觉有点冗长.有没有Kotlin解决这个问题的方法?

编辑:用例是在数据数据的"REPL like"环境中回答查询,即思考Matlab或SciPy.

Kir*_*man 10

就stdlib goest而言,这是最短的.但是,您可以自己定义辅助函数:

fun doubles(vararg values: Pair<Double, Double>) = values
    .map { doubleArrayOf(it.first, it.second) }
    .toTypedArray()
Run Code Online (Sandbox Code Playgroud)

用法:

fun main(args: Array<String>) {
    val path = doubles(1.0 to 2.0, 1.0 to 3.0, 3.0 to 4.0, 8.0 to 9.0)
}
Run Code Online (Sandbox Code Playgroud)

这不是最有效的解决方案,因为它涉及装箱和分配一个临时数组和列表,但如果你只是原型设计,这应该没问题.

编辑:

我还做了一个版本,你可以添加任意长度的数组:

inline fun doubles(block: DoubleArrayBuilder.() -> Unit) = DoubleArrayBuilder()
        .apply(block)
        .list.toTypedArray()

class DoubleArrayBuilder {
    val list = mutableListOf<DoubleArray>()

    fun add(vararg doubles: Double) = list.add(doubles)
}
Run Code Online (Sandbox Code Playgroud)

用法:

fun main(args: Array<String>) {
    val path = doubles {
        add(2.0, 3.0, 4.0)
        add(2.0, 3.0, 4.0)
        add(2.0, 3.0, 4.0)
    }
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*ard 5

arrayOf以及doubleArrayOf其他类似的东西,只是stdlib中的顶级函数.要缩短语法,您可以轻松地创建自己的函数,其范围位于顶级,类中,甚至是函数本地:

通过创建:

fun pathOf(vararg points: DoubleArray): Array<out DoubleArray> = points
fun pt(x: Double, y: Double) = doubleArrayOf(x,y)
Run Code Online (Sandbox Code Playgroud)

这允许:

val path = pathOf(pt(1.0, 2.0), pt(1.0, 2.0), pt(1.0, 3.0), pt(8.0, 9.0))
Run Code Online (Sandbox Code Playgroud)

现在,它为嵌套数组提供了对未来读者或代码的意义.名称的功能point,pt,xy,或任何适合你的使用情况.

此代码仅略长于原始代码,并且可能比Java更具可读性/意义:

double[][] path = {{1.0, 2.0}, {1.0, 3.0}, {3.0, 4.0}, {8.0, 9.0}}
Run Code Online (Sandbox Code Playgroud)

这些功能就像使用高效arrayOfdoubleArrayOf,如果反复使用JVM将最终inline他们,但是如果你紧张,你可以让他们inline自己.

Kotlin旨在扩展,任何时候遇到这样的问题考虑如何扩展API或更改功能以获得所需的可读性.