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)
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)
这些功能就像使用高效arrayOf和doubleArrayOf,如果反复使用JVM将最终inline他们,但是如果你紧张,你可以让他们inline自己.
Kotlin旨在扩展,任何时候遇到这样的问题考虑如何扩展API或更改功能以获得所需的可读性.
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |