这个问题在这里已经有了答案:
Order of init calls in Kotlin Array initialization
(2 个回答)
2年前关闭。
我将从字节流中读取数据。 Kotlin 是否为数组生成函数提供了索引(如 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/-init-.html 中所述)保证从零开始按顺序调用?Array.kt
文件在 builtins
下所以我不知道在哪里可以找到实际的代码。
最佳答案
看看at the source code for Array :
public inline constructor(size: Int, init: (Int) -> T)
init
参数是一个函数,它接受一个 int(特定项的索引),它期望返回 T 类型的值,数组由该值组成。正如其他答案通过示例所显示的那样,这些是按顺序调用的,因为这是“自然”的做法。如果您不明白我的意思,请考虑实现替代方案:
for (i in 0..size) {
this.addToArray(init(i));
}
或者:
for (i in (size - 1)..0 {
this.addToArray(init(i));
}
相比:
val indices = mutableListOf<Int>()
while (indices.size != size) {
val i = random.nextInt(size);
if (i !in indices) {
indices.add(i);
this.addToArray(init(i));
}
}
虽然我们看不到构造函数的源代码,但仅在其他答案中显示的示例就表明它们不能使用随机方法。应用来自 the first answer 的代码,从数学上讲,使用随机并按顺序打印出 0-49 的几率极低。
此外,这是 backed up by an answer here .生成的编译后的 Java 代码创建了一个从 0 到 size 的 for 循环。对于 JVM,假设它们不更改实现,您可以假设它会从 0 变为 size。但是无论是从 0 到 size 还是从 size 到 0,如果您不喜欢顺序,您可以随时将其反转。
如果您需要 100% 确定它从 0 到大小,或者如果实现发生变化,您可以执行以下操作:
var a = (0 until 10).step(1).toList().toTypedArray()
在这种情况下,它会生成一个数字为 0-9 的数组。
如果您想要对象,或以其他方式更改对象,您可以添加
.map {}
在创建列表之前。话虽如此,只要init
,这是一种矫枉过正的选择。功能如您所愿。您始终可以通过使用 IntelliJ、Android Studio、其他一些 IDE 或您选择的反编译器反编译代码来确认。但是无论实现如何,它们总是按顺序结束 - 所以你不必担心。他们唯一可能改变的是调用 init 函数的顺序,但它仍然会在结果数组中以相同的顺序结束。
关于arrays - Kotlin 数组 <初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821876/