Краткий справочник по многим способам обработки нулей в Kotlin

«Путь Java»: когда никакие другие методы не помогают, иногда старое — это золото.

if (foo == null) { ... }

Безопасный подход: использование нулевого безопасного оператора доступа. Используйте, когда вы не возражаете против нуля в конце.

return foo?.bar?.baz

Элвис: когда нули не годятся

return foo?.bar ?: "baz"
return foo ?: throw IllegalStateException("something's not right")

Предпосылки: более лаконичный Элвис.

requireNotNull(foo) { "something's not right" }
checkNotNull(foo) { "something's not right" }

Карта и фильтр: когда в коллекции не нужны нули

return foo.mapNotNull { it?.bar }
return foo.filterNotNull()

Встроенный: когда тип имеет встроенный метод

if (list.isNullOrEmpty()) { ... }

Замороженный способ: когда вы хотите запустить действие только тогда, когда оно не равно нулю. (подробнее о функциях области видимости)

return foo?.let{ it.go() }

Контракт и смарт-приведение: вы определяете свои собственные контракты Kotlin и позволяете компилятору смарт-приведение нуля.

Ультиматум: когда вы просто знаете, что это не будет null.

return foo!!  // throws NullPointerException if null

Тип платформы: это типы, определенные в Java. Вы можете идентифицировать его в IntelliJ, когда он показывает тип с !, например: Foo!. Они не запускают проверку компилятором на допустимость значений NULL, поэтому вы все равно можете получить исключение NullPointerException во время выполнения! Если вы контролируете код, вы можете добавить аннотацию обнуляемости, чтобы преобразовать его в неплатформенный тип (либо Foo?, либо Foo), что вызовет проверку компилятором обнуляемости.

// Java
@NotNull
Foo getFoo() { ... }

использованная литература

Здравствуйте, если вам понравился этот пост, я подумал, что вы могли бы заинтересоваться членством в Medium, чтобы получить доступ к качественному контенту от авторов Medium, не стесняйтесь использовать мою реферальную ссылку! Вам также могут понравиться эти футболки с дизайном, вдохновленным кодом.