Kotlin和详细的数组实例化

时间:2016-03-07 10:20:10

标签: arrays syntax kotlin

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

www.website.com

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

double[][] path = {{1.0, 2.0}, {1.0,3.0}, {3.0,4.0}, {8.0,9.0}}

感觉有点冗长。是否有Kotlin解决这个问题的方法?

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

2 个答案:

答案 0 :(得分:10)

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

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

用法:

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

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

编辑:

我还创建了一个可以添加任意长度数组的版本:

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

用法:

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

答案 1 :(得分:5)

arrayOfdoubleArrayOf以及其他类似的人只是stdlib中的顶级函数。要缩短语法,您可以轻松地在顶级,类中使用scope创建自己的函数,甚至可以在函数本地创建自己的函数:

通过创建:

fun pathOf(vararg points: DoubleArray): Array<out DoubleArray> = points
fun pt(x: Double, y: Double) = doubleArrayOf(x,y)

这允许:

val path = pathOf(pt(1.0, 2.0), pt(1.0, 2.0), pt(1.0, 3.0), pt(8.0, 9.0))

现在,它为嵌套数组提供了对未来读者或代码的意义。将函数命名为pointptxy或任何适合您用例的函数。

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

double[][] path = {{1.0, 2.0}, {1.0, 3.0}, {3.0, 4.0}, {8.0, 9.0}}

这些函数与使用arrayOfdoubleArrayOf一样高效,如果反复使用,JVM最终会inline它们,但如果你感到紧张,你可以使它们{{1}你自己。

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