假设我有通过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。
答案 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)
arrayOf
和doubleArrayOf
以及其他类似的人只是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))
现在,它为嵌套数组提供了对未来读者或代码的意义。将函数命名为point
,pt
,xy
或任何适合您用例的函数。
此代码仅略长于原始代码,并且可能比Java更具可读性/意义:
double[][] path = {{1.0, 2.0}, {1.0, 3.0}, {3.0, 4.0}, {8.0, 9.0}}
这些函数与使用arrayOf
和doubleArrayOf
一样高效,如果反复使用,JVM最终会inline
它们,但如果你感到紧张,你可以使它们{{1}你自己。
Kotlin旨在扩展,每当遇到这样的问题时,请考虑如何扩展API或更改功能以获得所需的可读性。