本质上,我需要从一些项目的不可变列表开始,将其转换为可变列表并添加一些项目,然后使用firstOrNull
. 这是我的暂存文件:
val immutableStarter = listOf(1, 2, 3)
val mutable = immutableStarter.toMutableList()
mutable.add(4)
mutable.addAll(listOf(5, 6, 7))
mutable.add(8)
println(mutable)
val result = mutable.firstOrNull { item ->
println("Checking Item $item")
item > 7
} ?: 0
println(result)
该println(mutable)
调用正确打印包含所有八个项目的列表。但是,该firstOrNull
操作似乎仅在列表中的前三个项目上运行。我只得到了"Checking Item $item"
三遍输出。如果我向它添加第四个项目,immutableStarter
它会检查四次。所以我能收集到的最好的东西,出于某种原因,它只是迭代初始的、不可变的起始列表中的项目。
如果我将第 10-15 行包装在try
/catch
或 with 中run
,我会得到我期望的输出 -"Checking Item $item"
列表中 8 项中的每一项的打印输出。
为什么这不像我写的那样工作,以及将firstOrNull
调用包装在try
/中catch
或者run
使它工作的原因是什么?
=================================================
编辑:有人要求我的暂存文件的输出。这里是:
Checking Item 1
Checking Item 2
Checking Item 3
val immutableStarter: List<Int>
val mutable: MutableList<Int>
true
true
true
[1, 2, 3, 4, 5, 6, 7, 8]
val result: Int
0
看起来它可能是如何评估暂存文件的问题 - 看起来 IntelliJ 可能正在尝试异步评估暂存文件。例如,切换Use REPL
IntelliJ 顶部的复选框,可以得到我期望的输出:
res2: kotlin.Boolean = true
res3: kotlin.Boolean = true
res4: kotlin.Boolean = true
[1, 2, 3, 4, 5, 6, 7, 8]
Checking Item 1
Checking Item 2
Checking Item 3
Checking Item 4
Checking Item 5
Checking Item 6
Checking Item 7
Checking Item 8
8