Saya tidak tahu apa yang ?:
terjadi dalam contoh kasus ini
val list = mutableList ?: mutableListOf()
dan mengapa itu bisa diubah menjadi ini
val list = if (mutableList != null) mutableList else mutableListOf()
Saya tidak tahu apa yang ?:
terjadi dalam contoh kasus ini
val list = mutableList ?: mutableListOf()
dan mengapa itu bisa diubah menjadi ini
val list = if (mutableList != null) mutableList else mutableListOf()
Jawaban:
TL; DR: Jika referensi objek yang dihasilkan [operan pertama] tidak null
, akan dikembalikan. Jika tidak, nilai operan kedua (yang mungkin null
) dikembalikan
The Operator Elvis adalah bagian dari banyak bahasa pemrograman, misalnya Kotlin tetapi juga Groovy atau C #. Menurut saya definisi Wikipedia cukup akurat:
Dalam bahasa pemrograman komputer tertentu, operator Elvis
?:
adalah operator biner yang mengembalikan operan pertamanya jika operan itu adalahtrue
, dan sebaliknya mengevaluasi dan mengembalikan operan keduanya. Ini adalah varian dari operator kondisional terner ,? :
, ditemukan di bahasa-bahasa (dan banyak lainnya): operator Elvis adalah operator ternary dengan operan kedua dihilangkan .
Hal berikut ini terutama berlaku untuk Kotlin:
Beberapa bahasa pemrograman komputer memiliki semantik yang berbeda untuk operator ini. Alih-alih operan pertama harus menghasilkan boolean, itu harus menghasilkan referensi objek . Jika referensi objek yang dihasilkan tidak
null
, akan dikembalikan. Jika tidak, nilai operan kedua (yang mungkinnull
) dikembalikan.
Sebuah contoh:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
elvis operator
bisa direduksi menjadi sesuatu yang lain. bagus! Dan penjelasan yang bagus, terima kasih!
The Elvis Operator diwakili oleh tanda tanya diikuti oleh titik dua: ?:
dan dapat digunakan dengan sintaks ini:
first operand ?: second operand
Ini memungkinkan Anda untuk menulis kode consise, dan berfungsi sebagai berikut:
Jika first operand
tidak null , maka itu akan dikembalikan. Jika nilainya null , maka second operand
akan dikembalikan. Ini dapat digunakan untuk menjamin bahwa ekspresi tidak akan mengembalikan nilai null, karena Anda akan memberikan nilai bukan null jika nilai yang diberikan adalah null.
Misalnya (di Kotlin):
fun retrieveString(): String { //Notice that this type isn't nullable
val nullableVariable: String? = getPotentialNull() //This variable may be null
return nullableVariable ?: "Secondary Not-Null String"
}
Dalam kasus ini, jika nilai yang dihitung dari getPotentialNull
bukan null, itu akan dikembalikan oleh retrieveString
; Jika nilainya nol, ekspresi kedua "Secondary Not-Null String"
akan dikembalikan.
Perhatikan juga bahwa ekspresi sisi kanan dievaluasi hanya jika sisi kiri adalah null .
Di Kotlin, Anda dapat menggunakan ekspresi apa pun seperti second operand
, seperti throw Exception
ekspresi
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Nama Elvis Operator berasal dari penyanyi terkenal Amerika Elvis Presley . Gaya rambutnya menyerupai Tanda Tanya
Sumber: Wojda, I. Moskala, M. Pengembangan Android dengan Kotlin. 2017. Penerbitan Packt
Ini disebut operator Elvis dan memang ... Persis seperti yang Anda jelaskan dalam pertanyaan Anda. Jika sisi kiri adalah sebuah null
nilai, ia mengembalikan sisi kanan sebagai gantinya, semacam fallback. Jika tidak, itu hanya mengembalikan nilai di sisi kiri.
a ?: b
hanyalah singkatan dari if (a != null) a else b
.
Beberapa contoh lagi dengan tipe:
val x: String? = "foo"
val y: String = x ?: "bar" // "foo", because x was non-null
val a: String? = null
val b: String = a ?: "bar" // "bar", because a was null
a != null ? a : b
Mari kita lihat definisi tersebut :
Ketika kita memiliki referensi r nullable, kita dapat mengatakan "jika r bukan null, gunakan itu, jika tidak, gunakan beberapa nilai non-null x":
Itu ?:
(Elvis) menghindari verbositas dan membuat kode Anda sangat ringkas.
Misalnya, banyak fungsi ekstensi collection yang dikembalikan null
sebagai fallback.
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:
memberi Anda cara untuk menangani kasus fallback dengan anggun bahkan jika Anda memiliki beberapa lapisan fallback. Jika demikian, Anda cukup menghubungkan banyak operator Elvis, seperti di sini:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Jika Anda akan mengungkapkan hal yang sama dengan jika lain itu akan menjadi lebih banyak kode yang lebih sulit untuk dibaca.
Sederhananya kami dapat mengatakan bahwa, Anda memiliki dua tangan. Anda ingin tahu, apakah tangan kiri Anda sedang bekerja? Jika tangan kiri tidak berfungsi, return
empty
lainbusy
Contoh untuk Java:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Contoh untuk Kotlin:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
Pada dasarnya, jika sisi kiri Elvis mengembalikan nol karena suatu alasan, mengembalikan sisi kanan sebagai gantinya.
yaitu
val number: Int? = null
println(number ?: "Number is null")
Jadi, jika angka TIDAK nol , itu akan mencetak angka, jika tidak akan mencetak "Nomor adalah null".
Operator elvis di Kotlin digunakan untuk keamanan nol.
x = a ?: b
Pada kode di atas, x
akan diberikan nilai a
if a null
dan b
if a
is null
.
Kode kotlin yang setara tanpa menggunakan operator elvis adalah di bawah ini:
x = if(a == null) b else a