Безопасная Операция Доступа
val dialog : Dialog? = Dialog()
dialog?.dismiss() // if the dialog will be null,the dismiss call will be omitted
Позволила функции
user?.let {
//Work with non-null user
handleNonNullUser(user)
}
Ранний выход
fun handleUser(user : User?) {
user ?: return //exit the function if user is null
//Now the compiler knows user is non-null
}
Неизменные тени
var user : User? = null
fun handleUser() {
val user = user ?: return //Return if null, otherwise create immutable shadow
//Work with a local, non-null variable named user
}
Значение по умолчанию
fun getUserName(): String {
//If our nullable reference is not null, use it, otherwise use non-null value
return userName ?: "Anonymous"
}
, Использование val вместо var
val
только для чтения, var
изменяемо. It’s рекомендовал использовать в качестве многих свойств только для чтения, как Вы можете, они быть ориентированными на многопотоковое исполнение.
lateinit
Использования Иногда Вы can’t используют неизменные свойства. Например, это происходит на Android, когда некоторое свойство инициализируется в onCreate()
вызов. Для этих ситуаций Kotlin имеет функцию языка, названную lateinit
.
private lateinit var mAdapter: RecyclerAdapter<Transaction>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mAdapter = RecyclerAdapter(R.layout.item_transaction)
}
fun updateTransactions() {
mAdapter.notifyDataSetChanged()
}
Дополнение к @Benito Bertoli,
комбинация на самом деле, в отличие от этого, если еще
"test" ?. let {
println ( "1. it=$it" )
} ?: let {
println ( "2. it is null!" )
}
результат:
1. it=test
, Но если:
"test" ?. let {
println ( "1. it=$it" )
null // finally returns null
} ?: let {
println ( "2. it is null!" )
}
результат:
1. it=test
2. it is null!
кроме того, если использование elvis сначала:
null ?: let {
println ( "1. it is null!" )
} ?. let {
println ( "2. it=$it" )
}
результат:
1. it is null!
2. it=kotlin.Unit