Kotlin Filter - выражение не используется - PullRequest
2 голосов
/ 29 сентября 2019

У меня есть приложение Kotlin, которое фильтрует элементы коллекции способом, подобным следующему:

fun main() {
    val strings = arrayOf("A", "B", "C")
    val acceptAll = true
    println(
            strings.filter {
                if (acceptAll) {
                    true // "The expression is unused"
                }
                // Other filters
                false
            }
    )
}

Однако IntelliJ подсвечивает строку true с сообщением «Выражение не используется»,Конечно, моя программа не находит этот путь кода, фильтр возвращает false, и я получаю пустой массив.

Это упрощенный пример, но он показывает, что япытаюсь выполнить.

Буду признателен за любые предложения.

Спасибо!

1 Ответ

3 голосов
/ 29 сентября 2019

Чтобы на самом деле вернуть значение true из лямбды внутри оператора if, вы должны заменить true на return@filter true.

. Оператор true не означает «вернуть true», он толькоозначает, что при оценке результат оценки будет истинно .Только последнее утверждение лямбды считается возвращаемым значением.И поскольку true не было последним утверждением, оно не было возвращено.После оценки true выполнение выпрыгнуло из тела if-case и выполнило следующий оператор, который является false.Поскольку это также последний оператор в лямбда-выражении, он также являлся возвращаемым значением лямбда-выражения, хотя он выполнял тело оператора if непосредственно перед этим.

Вы можете оставить оператор false без изменений.Поскольку это последний оператор (в отличие от true) в лямбде, он также будет возвращаемым значением из лямбды, если этот оператор выполняется.Однако для симметрии я бы лично изменил его на return@filter false.

Документы по этому вопросу можно найти по Возвращая значение из лямбда-выражения и Return at Labels

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...