По сути, мне нужно начать с неизменного списка из нескольких элементов, преобразовать его в изменяемый список и добавить несколько элементов, а затем перебрать его с помощью 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
или с помощью 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