You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中能否创建数组索引引用?避免重复调用函数赋值

Kotlin中数组元素引用的实现思路

首先明确:你设想的这种直接创建数组元素引用(像val r: Reference = arr[xxx]; r = 0)的写法在Kotlin里是做不到的。因为JVM平台本身不支持这种直接指向内存元素的低级引用操作,Kotlin也没有提供对应的语法糖来实现这种语法。

不过可以通过几种方式达到避免重复调用长函数的核心目的,贴合你想要的"引用"思路:

1. 最简洁:提前存储索引

这是最直接且高效的方案,本质是把长函数的计算结果(索引)存下来,后续直接使用该索引操作数组:

val arr = Array(20) { it }
val index = some_very_long_function()
arr[index] = 0
// 后续如果还要操作这个位置,直接用index即可,不用再调用函数

2. 模拟可读写的元素引用

如果想要更贴近"引用"的使用体验,可以自己实现一个简单的包装类,封装对数组元素的读写操作:

// 自定义可读写引用类
class MutableElementRef<T>(
    private val getValue: () -> T,
    private val setValue: (T) -> Unit
) {
    var value: T
        get() = getValue()
        set(newValue) = setValue(newValue)
}

// 使用示例
val arr = Array(20) { it }
val index = some_very_long_function()
val r = MutableElementRef(
    getValue = { arr[index] },
    setValue = { arr[index] = it }
)

r.value = 0 // 等效于 arr[index] = 0
println(r.value) // 读取该位置的当前值

这个类模拟了一个指向数组元素的"引用",通过r.value就能完成读写,不用重复写数组和索引的组合。

3. 利用标准库的原子引用(线程安全场景)

如果你的场景需要线程安全,可以直接用Kotlin标准库的AtomicReference,不过需要先把元素值取出来维护,修改后再写回数组:

import java.util.concurrent.atomic.AtomicReference

val arr = Array(20) { it }
val index = some_very_long_function()
val r = AtomicReference(arr[index])

r.set(0) // 修改引用中的值
arr[index] = r.get() // 写回数组

这种方式适合多线程环境,但如果不需要线程安全,自定义包装类更轻量。


内容的提问来源于stack exchange,提问作者Henktorius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:05:57