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 adalah true, 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 mungkin null) dikembalikan.
Sebuah contoh:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
Ini sangat keren. Saya tidak pernah berpikir elvis operatorbisa direduksi menjadi sesuatu yang lain. bagus! Dan penjelasan yang bagus, terima kasih!
sud007
88
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 operandtidak null , maka itu akan dikembalikan. Jika nilainya null , maka second operandakan 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):
funretrieveString(): String { //Notice that this type isn't nullableval nullableVariable: String? = getPotentialNull() //This variable may be nullreturn nullableVariable ?: "Secondary Not-Null String"
}
Dalam kasus ini, jika nilai yang dihitung dari getPotentialNullbukan 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 Exceptionekspresi
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
Setelah beberapa saat, saya tidak mengerti mengapa disebut Operator Elvis. Ilustrasi Anda membuat saya tahu mengapa disebut Operator Elvis. :)
Yohanes AI
apakah cerita tentang Elvis itu benar? haha
Hillcow
@Kerooker Dia tidak tersenyum,?: | akan IMO yang lebih baik.
ahmed galal
38
Ini disebut operator Elvis dan memang ... Persis seperti yang Anda jelaskan dalam pertanyaan Anda. Jika sisi kiri adalah sebuah nullnilai, ia mengembalikan sisi kanan sebagai gantinya, semacam fallback. Jika tidak, itu hanya mengembalikan nilai di sisi kiri.
a ?: bhanyalah 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? = nullval b: String = a ?: "bar"// "bar", because a was null
?: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, returnemptylainbusy
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 = 5val l : Int = if (a != null) a.length else"a is null"
Xakan tetap nulljika keduanya Adan Bmengevaluasi kenull
Oleh karena itu, jika Anda ingin Xselalu menjadi non-null, pastikan Bselalu a non-nullatau yang Bselalu mengevaluasi non-nullapakah itu fungsi atau ekspresi.
Jawaban:
TL; DR: Jika referensi objek yang dihasilkan [operan pertama] tidak
null
, akan dikembalikan. Jika tidak, nilai operan kedua (yang mungkinnull
) dikembalikanThe Operator Elvis adalah bagian dari banyak bahasa pemrograman, misalnya Kotlin tetapi juga Groovy atau C #. Menurut saya definisi Wikipedia cukup akurat:
Hal berikut ini terutama berlaku untuk Kotlin:
Sebuah contoh:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
sumber
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:Ini memungkinkan Anda untuk menulis kode consise, dan berfungsi sebagai berikut:
Jika
first operand
tidak null , maka itu akan dikembalikan. Jika nilainya null , makasecond 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 olehretrieveString
; 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
, sepertithrow Exception
ekspresireturn 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
sumber
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 dariif (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
sumber
a != null ? a : b
Mari kita lihat definisi tersebut :
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.
sumber
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"
sumber
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".
sumber
Operator elvis di Kotlin digunakan untuk keamanan nol.
Pada kode di atas,
x
akan diberikan nilaia
if anull
danb
ifa
isnull
.Kode kotlin yang setara tanpa menggunakan operator elvis adalah di bawah ini:
x = if(a == null) b else a
sumber
Sedikit tambahan adalah ini
X
akan tetapnull
jika keduanyaA
danB
mengevaluasi kenull
Oleh karena itu, jika Anda ingin
X
selalu menjadinon-null
, pastikanB
selalu anon-null
atau yangB
selalu mengevaluasinon-null
apakah itu fungsi atau ekspresi.sumber