Безопасный вызов ?. и Elvis ?: в реальном коде
Объединяйте безопасные вызовы в цепочки и задавайте резервные значения с помощью оператора Elvis.
«Безопасный вызов ?. и Elvis ?: в реальном коде» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Два оператора с большим влиянием
Безопасный вызов ?. вызывает член только в том случае, если получатель не равен null. Оператор Элвиса ?: предоставляет запасной вариант, когда левая часть равна null.
Основы безопасного вызова
x?.member вычисляется как null, если x равен null; в противном случае доступ к member выполняется обычным образом.
fun main() {
val name: String? = "Kotlin"
val len: Int? = name?.length
println(len) // 6
val nope: String? = null
println(nope?.length) // null
}Основы оператора Элвиса
x ?: default возвращает x, если оно не равно null, а в противном случае — значение default справа.
fun main() {
val name: String? = null
val display = name ?: "Anonymous"
println(display) // Anonymous
}Объединение безопасного вызова и оператора Элвиса
Распространённый идиоматичный вариант: obj?.member ?: default — получить значение или использовать запасной вариант.
fun main() {
val name: String? = null
val length = name?.length ?: 0
println("length = $length") // 0
}Цепочки безопасных вызовов
Объединяйте несколько ?. в цепочку: всё выражение сразу даёт null, если любое звено равно null.
class Address(val city: String?)
class User(val address: Address?)
fun main() {
val u: User? = User(Address(null))
val city = u?.address?.city ?: "Unknown"
println(city) // Unknown
}Исключение в правой части оператора Элвиса
Правая часть оператора Элвиса может быть любым выражением, включая throw, что удобно для проверок обязательных значений.
fun loadConfig(path: String?): String {
val p = path ?: throw IllegalArgumentException("path required")
return "loaded $p"
}
fun main() {
println(loadConfig("/etc/app"))
// loadConfig(null) // throws
}Безопасный вызов методов
Безопасные вызовы работают с любым методом, а не только с доступом к свойству.
fun main() {
val raw: String? = " hello "
val cleaned = raw?.trim()?.uppercase() ?: ""
println(cleaned) // HELLO
}Безопасный вызов в условиях
Безопасные вызовы можно использовать внутри условий. Объединяйте их с оператором Элвиса, чтобы задать логические значения по умолчанию.
fun main() {
val name: String? = "Alice"
if (name?.startsWith("A") == true) {
println("Starts with A")
}
}Оператор Элвиса с return
Используйте оператор Элвиса с return в защитных условиях: завершайте выполнение досрочно, если обязательное значение равно null.
fun process(input: String?) {
val safe = input ?: return
println("processing $safe")
}
fun main() {
process("abc")
process(null) // returns silently
}Оператор Элвиса с continue/break
Внутри циклов оператор Элвиса может сразу перейти к continue или break, обеспечивая краткую обработку null.
fun main() {
val items: List<String?> = listOf("a", null, "b", null, "c")
for (item in items) {
val v = item ?: continue
print("$v ")
}
println() // a b c
}Практика: поиск конфигурации
Безопасный вызов и оператор Элвиса объединяются в одну строку, которая считывает необязательную конфигурацию со значением по умолчанию.
class Config(val timeoutMs: Int?, val host: String?)
fun main() {
val cfg: Config? = Config(null, "prod.example.com")
val timeout = cfg?.timeoutMs ?: 5000
val host = cfg?.host ?: "localhost"
println("$host @ $timeout ms")
}Быстрая проверка
Во что вычисляется user?.email ?: "unknown", если user равен null?
Итоги
Объединяйте безопасный вызов (?.) и оператор Элвиса (?:), чтобы писать краткий код с безопасной обработкой null. Используйте оператор Элвиса с throw или return в защитных условиях, которые досрочно завершают выполнение при отсутствии данных.
Изучай Kotlin с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Безопасный вызов ?. и Elvis ?: в реальном коде» бесплатный?
Да — полный текст урока «Безопасный вызов ?. и Elvis ?: в реальном коде» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Безопасный вызов ?. и Elvis ?: в реальном коде»?
Объединяйте безопасные вызовы в цепочки и задавайте резервные значения с помощью оператора Elvis. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Безопасный вызов ?. и Elvis ?: в реальном коде»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типы, допускающие null, и модификатор ?
- Безопасный вызов ?. и Elvis ?: в реальном коде
- let, also и run с получателями, допускающими null
- Оператор !!: когда и почему его следует избегать