Как сделать изменяемый список Kotlin, добавить элементы, а затем выполнить итерацию по полученному неизменному списку? - PullRequest
1 голос
/ 30 апреля 2020

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