Котлин – эквивалентность комбинации Свифта «если пусть + литье»

Я пытаюсь выяснить, как достичь комбинации «if let + cast» в kotlin:

быстро:

if let user = getUser() as? User { // user is not nil and is an instance of User } 

Я видел некоторую документацию, но они ничего не говорят об этой комбинации

https://medium.com/@adinugroho/unwrapping-sort-of-optional-variable-in-kotlin-9bfb640dc709 https://kotlinlang.org/docs/reference/null-safety.html

Один из вариантов – использовать безопасный оператор трансляции + безопасный вызов + let :

 (getUser() as? User)?.let { user -> ... } 

Другим было бы использование умного броска внутри лямбды, переданного, чтобы let :

 getUser().let { user -> if (user is User) { ... } } 

Но, возможно, самым читаемым было бы просто ввести переменную и использовать умный листинг прямо там:

 val user = getUser() if (user is User) { ... } 

В Котлине вы можете использовать let:

 val user = getUser()?.let { it as? User } ?: return 

Это решение наиболее близко для защиты, но оно может быть полезно.

Kotlin может автоматически определить, является ли значение нулем или нет в текущей области на основе регулярных операторов if без необходимости специального синтаксиса.

 val user = getUser() if (user != null) { // user is known to the compiler here to be non-null } 

Он работает наоборот

 val user = getUser() if (user == null) { return } // in this scope, the compiler knows that user is not-null // so there's no need for any extra checks user.something 

В Котлине вы можете использовать:

 (getUser() as? User)?.let { user -> // user is not null and is an instance of User } 

as? является «безопасным» оператором трансляции, который возвращает null вместо того, чтобы вызывать ошибку при сбое.

Как насчет этого?

 val user = getUser() ?: return 
Intereting Posts
Могу ли я указать тип свойства в делегате? TornadoFX как добавить проверку при редактировании TableView Smartcasting на и с платформы типа в kotlin Сообщение Firebase, полученное несколько раз Модуль библиотеки Android, разработанный в Kotlin, экспортируется в приложение Java, вызывающее неудачное разрешение: Lkotlin / jvm / internal / Intrinsics «Использование стиля Builder методами, которые возвращают Unit» на сайте Kotlin, запутывает меня В Kotlin при использовании Kovenant Promise.of (значение) иногда я исключаю исключения Как создать запрос HQL с использованием полей расширенного класса Захват ArgumentCaptor, возвращающий значение null Как получить завершение кода IntelliJ IDEA для импорта статических методов Java в качестве функций верхнего уровня Kotlin? Являются ли числовые операции с использованием Kotlin столь же быстрыми, как эквивалент с Java-примитивами? Конструктор ненулевой перегрузки Как вернуть значение из функции в kotlin Желающий инициализировать объект в котлин? используя Gson в kotlin для анализа json-массива