Что выведет код Middle Null-safety обновлено

let с Elvis и неожиданный результат

Вопрос

Что выведет код? По строке на каждый вывод.

fun label(s: String?): String =
    s?.let { if (it.isBlank()) null else it.trim() } ?: "empty"

fun main() {
    println(label("  hi  "))
    println(label("   "))
    println(label(null))
    val n: Int? = null
    println(n?.plus(1) ?: -1)
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: hi, empty, empty, -1. let возвращает результат лямбды.

Что выведет

hi
empty
empty
-1

Разбор

let возвращает результат лямбды. Для " hi " это "hi". Для пробелов лямбда возвращает null, и Elvis подставляет empty; это важная деталь: ?: срабатывает и тогда, когда let выполнился, но вернул null. Для null блок не выполняется вовсе. n?.plus(1) даёт null, отсюда -1.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.