Null Safety Patterns
Elvis Operator
Choose a fallback value with ?:.
elvis
The Elvis operator keeps a present value or returns the expression on the right.
Elvis Operator
ElvisOperator.kt
Replay: real traced execution (multi-file project)
fun main() {
val name: String? = "Ada"
val display = name ?: "anonymous"
val greeting = "hello, $display"
println("display=$display")
println(greeting)
}
fun main() {
val name: String? = null
val display = name ?: "anonymous"
val greeting = "hello, $display"
println("display=$display")
println(greeting)
}
fun main() {
val name: String? = "Bo"
val display = name ?: "anonymous"
val greeting = "hello, $display"
println("display=$display")
println(greeting)
}
name ← Ada, display ← Ada, greeting ← hello, Ada
1fun main() {2 val name→ Ada: String? = "Ada" //@name=null, "Bo"3 val display→ Ada = nameAda ?: "anonymous"4 val greeting→ hello, Ada = "hello, $displayAda"56 println("display=$displayAda")7 println(greetinghello, Ada)8}outputdisplay=Ada hello, Ada
name ← null, display ← anonymous, greeting ← hello, anonymous
1fun main() {2 val name→ null: String? = null3 val display→ anonymous = namenull ?: "anonymous"4 val greeting→ hello, anonymous = "hello, $displayanonymous"56 println("display=$displayanonymous")7 println(greetinghello, anonymous)8}outputdisplay=anonymous hello, anonymous
name ← Bo, display ← Bo, greeting ← hello, Bo
1fun main() {2 val name→ Bo: String? = "Bo"3 val display→ Bo = nameBo ?: "anonymous"4 val greeting→ hello, Bo = "hello, $displayBo"56 println("display=$displayBo")7 println(greetinghello, Bo)8}outputdisplay=Bo hello, Bo
Pick the Display Value
namemay hold text ornull.- The left side of
?:is tried first. - If
nameis present,displayuses it. - If
nameis null,displayuses"anonymous". |namevalue |display| | --- | --- | |"Ada"|Ada| |null|anonymous|
Exercise: ElvisOperator.kt
Use the Elvis operator to greet a nullable name or fall back to anonymous