Что делают знаки вопроса в коде

Есть строка язык Kotlin

val currentindex = saveinstateState?.getInt(KEY_INDEX,0) ?: 0

Подскажите пожалуйста как работают эти два знака вопроса? знаю что это типа условия, но не пойму логики. Или подскажите где можно про них можно почитать. Я просто не знаю как такие условия называются.


Ответы (1 шт):

Автор решения: Alex_Skvortsov

Знак вопроса перед вызовом свойства или метода (перед точкой) в Kotlin означает выполнение проверки на null. То есть код

val currentindex = saveinstateState?.getInt(KEY_INDEX, 0)

Эквивалентен следующему:

val currentindex = if(saveinstateState == null || saveinstateState.getInt(KEY_INDEX, 0) == null) 
    null 
else saveinstateState.getInt(KEY_INDEX, 0)

Знак вопроса с двоеточием является элвис-оператором.

Элвис-оператор сначала проверяет значение в левой части выражения. Если это значение отлично от null, Элвис-оператор возращает его, но если в левой части равно null, то возвращает то что в правой

Проще всего его понять на примере. Если взять Ваш код полностью (вместе с элвис оператором):

val currentindex = saveinstateState?.getInt(KEY_INDEX, 0) ?: 0

То и эквивалентный код через if немного изменится:

val currentindex = if(saveinstateState == null || saveinstateState.getInt(KEY_INDEX, 0) == null) 
    0 // Вот здесь разница, без элвиса был бы null
else saveinstateState.getInt(KEY_INDEX, 0)

Просто забавный факт, позволяющий чуть легче запомнить название элвис-оператора:

Название «Оператор Элвиса» относится к тому факту, что когда его обычное обозначение, ?: , рассматривается сбоку, оно напоминает смайлик Элвиса Пресли с его специфической прической quiff

→ Ссылка