Apa yang setara dengan ungkapan ini di Kotlin?
a ? b : c
Ini bukan kode yang valid di Kotlin.
kotlin
conditional-operator
Drew Noakes
sumber
sumber
Jawaban:
Di Kotlin,
if
pernyataan adalah ekspresi. Jadi kode berikut ini setara:Perbedaan antara ekspresi dan pernyataan adalah penting di sini. Dalam Java / C # / JavaScript,
if
bentuk pernyataan, yang berarti bahwa itu tidak menentukan nilai. Lebih konkretnya, Anda tidak dapat menetapkannya ke variabel.Jika Anda berasal dari bahasa di mana
if
pernyataan, ini mungkin tampak tidak wajar tetapi perasaan itu harus segera mereda.sumber
when
.x = a==b
b + if (a) c else d
vs.b + (c if (a) else d)
Yang terakhir membutuhkan kurung tambahan. karenac
tidak tertutup oleh kondisi danelse
.Anda dapat menentukan
Boolean
fungsi ekstensi Anda sendiri yang kembalinull
ketikaBoolean
adalahfalse
untuk menyediakan struktur yang mirip dengan operator ternary:Ini akan membuat
a ? b : c
ekspresi diterjemahkan menjadia then b ?: c
, seperti:Pembaruan: Tetapi untuk melakukan beberapa saklar kondisional seperti Java, Anda akan memerlukan sesuatu seperti itu
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
perhatikan lambda. Perhitungan isinya harus ditunda sampai kami pastikancondition
adalahtrue
Yang ini terlihat kikuk, itu sebabnya ada permintaan yang tinggi ada untuk operator pelabuhan ternary Jawa ke Kotlin
sumber
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
operator di sini adalahelvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
adalah apa yang dapat Anda gunakan sebagai ganti ekspresi operator ternary
a ? b : c
.Di Kotlin, banyak pernyataan kontrol termasuk
if
,when
atau bahkantry
dapat digunakan sebagai ekspresi . Ini berarti bahwa mereka dapat memiliki hasil yang dapat ditetapkan ke variabel, dikembalikan dari fungsi dll.Secara sintaksis, tidak perlu operator ternary
Sebagai hasil dari ekspresi Kotlin, bahasa tidak benar-benar membutuhkan operator ternary .
adalah apa yang dapat Anda gunakan sebagai ganti ekspresi operator ternary
a ? b : c
.Saya pikir idenya adalah bahwa ekspresi sebelumnya lebih mudah dibaca karena semua orang tahu apa yang
ifelse
dilakukan, sedangkan? :
agak tidak jelas jika Anda belum terbiasa dengan sintaks.Meskipun demikian, saya harus mengakui bahwa saya sering kehilangan operator ternary yang lebih nyaman.
Alternatif Lainnya
kapan
Anda mungkin juga melihat
when
konstruksi yang digunakan di Kotlin ketika kondisinya diperiksa. Ini juga cara untuk mengungkapkan jika-cascade dengan cara alternatif. Berikut ini sesuai dengan contoh PL.Ekstensi
Seperti banyak contoh yang baik ( Operator Bersyarat Kotlin Ternary ) dalam jawaban lain menunjukkan, ekstensi juga dapat membantu memecahkan kasus penggunaan Anda.
sumber
Untuk saya sendiri saya menggunakan fungsi ekstensi berikut:
Pertama akan mengembalikan asalkan nilai default dalam kasus objek sama dengan nol. Kedua akan mengevaluasi ekspresi yang disediakan dalam lambda dalam kasus yang sama.
Pemakaian:
Secara pribadi bagi saya kode di atas lebih mudah dibaca daripada
if
inlining konstruksisumber
e.getMessage() ?: "unknown"
. Yang kedua dapat dinyatakan sebagaiobj?.lastMessage?.timestamp ?: { Date() }()
Setara dengan operator terner Jawa
adalah IF sederhana di Kotlin dalam satu baris
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Kasus khusus untuk perbandingan Null
Anda dapat menggunakan operator Elvis
sumber
Tidak ada operator ternary di kotlin, karena
if else
blok mengembalikan nilaijadi, Anda bisa melakukan:
val max = if (a > b) a else b
alih-alih javamax = (a > b) ? b : c
Kami juga dapat menggunakan
when
konstruksi, juga mengembalikan nilai:Berikut ini tautan untuk dokumentasi kotlin: Aliran Kontrol: if, when, for, while
sumber
sumber
Beberapa kasus sudut tidak disebutkan dalam jawaban lain.
Sejak kemunculan takeIf di Kotlin 1.1 , operator ternary
a ? b : c
juga dapat diekspresikan seperti ini:Ini menjadi lebih pendek jika c adalah
null
:Juga catat bahwa tipikal di dunia Java nol cek seperti
value != null ? value : defaultValue
menerjemahkan dalam Kotlin ideomatis menjadi adilvalue ?: defaultValue
.Serupa
a != null ? b : c
dapat diterjemahkan kea?.let { b } ?: c
.sumber
b.takeIf { a } ?: c
lebih pendek dan lebih mudah dibaca daripadaif (a) b else c
? Operator Terneray tentu saja merupakan fitur yang hilang di Kotlin karena nama variabel dan kondisinya dapat panjang dan membuat Anda membagi garis yang buruktakeIf
selalu mengevaluasi kasus sebenarnya (di sinia
). Tidak hanya ekspresi itu dapat dihitung secara sia-sia jikaa
kebetulan salah, tetapi Anda tidak bisa mendapatkan manfaat dari gips cerdas à laif (a is Int) { a + 3 }
.{ a }
adalah lambda yang dievaluasi dengan malas.b
)". Tetapi meski{ a }
malas, harus dievaluasi untuk menentukan hasil ekspresi.Lihatlah dokumen :
sumber
Jawa
Setara dengan Kotlin :
sumber
TUGAS :
Mari kita perhatikan contoh berikut:
Kami membutuhkan yang setara di Kotlin berikut:
SOLUSI :
1.a . Anda dapat menggunakan
if-expression
di Kotlin:1.b . Akan jauh lebih baik jika Anda membalik ini
if-expression
(mari kita lakukan tanpanot
):2 . Operator Kotlin's Elvis
?:
dapat melakukan pekerjaan dengan lebih baik:3 . Atau gunakan
Extension function
untukAnswer
kelas yang sesuai :4 . Menggunakan
Extension function
Anda dapat mengurangi kode berkatElvis operator
:5 . Atau cukup gunakan
when
operator:Semoga ini membantu.
sumber
saat mengganti operator sakelar dari bahasa yang mirip C. Dalam bentuk yang paling sederhana terlihat seperti ini
sumber
when
sebagai pernyataan, bukan ekspresi. Perbandingan yang lebih relevan dengan ekspresi kondisional terner adalah memiliki setiap cabang mengembalikan nilai, sehingga keseluruhan ketika ekspresi mengevaluasi ke nilai (seperti yang terjadi dengan kondisional terner).Tidak ada operator ternary di Kotlin. Tampaknya bermasalah pada pandangan pertama. Tetapi berpikir kita bisa melakukannya dengan pernyataan inline if else karena ini adalah ekspresi di sini. Yang harus kita lakukan -
Di sini kita dapat lagi jika memblokir terlalu banyak yang kita butuhkan. Suka-
Jadi saluran ini sangat sederhana dan lebih mudah dibaca daripada operator ternary. ketika kita menggunakan lebih dari satu operator ternary di java sepertinya mengerikan. Tetapi di sini kita memiliki sintaks yang jelas. bahkan kita bisa menulisnya dalam banyak baris juga.
sumber
Anda dapat menggunakannya
var a= if (a) b else c
sebagai pengganti operator ternary.Konsep lain yang baik dari kotlin adalah operator Elvis. Anda tidak perlu memeriksa nol setiap saat.
Ini akan mengembalikan panjang jika b bukan nol jika tidak dieksekusi pernyataan sisi kanan.
sumber
seperti dikutip Drew Noakes, kotlin menggunakan jika pernyataan sebagai ekspresi, sehingga Operator Bersyarat tidak diperlukan lagi,
tetapi dengan fungsi ekstensi dan infix overloading, Anda bisa menerapkannya sendiri, berikut ini contohnya
lalu gunakan seperti ini
sumber
Pendekatan lain yang menarik adalah menggunakan
when
:Dapat sangat berguna dalam beberapa skenario yang lebih kompleks. Dan jujur, itu lebih mudah dibaca daripada bagi saya
if ... else ...
sumber
Anda dapat melakukannya dengan berbagai cara di Kotlin
Menggunakan if
Menggunakan kapan
Keamanan Null
sumber
Tidak ada operasi ternary di Kotlin, tetapi ada beberapa cara yang menyenangkan untuk mengatasinya. Seperti yang telah ditunjukkan orang lain, terjemahan langsung ke Kotlin akan terlihat seperti ini:
Tapi, secara pribadi, saya pikir itu bisa sedikit berantakan dan sulit dibaca. Ada beberapa opsi lain yang dibangun ke perpustakaan. Anda dapat menggunakan takeIf {} dengan operator elvis:
Apa yang terjadi di sana adalah bahwa perintah takeIf {} mengembalikan result1 atau null Anda, dan operator elvis menangani opsi nol. Ada beberapa opsi tambahan, takeUnless {}, misalnya:
Bahasanya jelas, Anda tahu apa yang dilakukannya.
Jika ini adalah kondisi yang umum digunakan, Anda juga dapat melakukan sesuatu yang menyenangkan seperti menggunakan metode ekstensi sebaris. Misalnya, kita ingin melacak skor game sebagai Int, dan kami ingin selalu mengembalikan 0 jika kondisi yang diberikan tidak terpenuhi:
Ok, sepertinya jelek. Tetapi pertimbangkan bagaimana tampilannya ketika digunakan:
Seperti yang Anda lihat, Kotlin menawarkan banyak fleksibilitas dalam cara Anda memilih untuk mengekspresikan kode Anda. Ada banyak variasi contoh saya dan mungkin cara yang belum saya temukan. Saya harap ini membantu!
sumber
takeIf
memang pilihan favorit saya, sangat elegan.Ingat operator ternary dan operator Elvis memiliki makna yang berbeda di Kotlin tidak seperti dalam banyak bahasa populer. Melakukan
expression? value1: value2
akan memberi Anda kata-kata buruk oleh kompiler Kotlin , tidak seperti bahasa lain karena tidak ada operator ternary di Kotlin seperti yang disebutkan dalam dokumen resmi . Alasannya adalah bahwa pernyataan if, when dan try-catch sendiri mengembalikan nilai.Jadi, melakukan
expression? value1: value2
bisa diganti denganThe Elvis Operator yang Kotlin memiliki, bekerja hanya dalam kasus variabel nullable ex .:
Pemahaman yang lebih jelas dapat dicapai dari jawaban-jawaban ini .
sumber
Anda dapat menggunakan
if
ekspresi untuk ini di Kotlin. Di Kotlinif
adalah ekspresi dengan nilai hasil. Jadi di Kotlin kita bisa menulisdan di Jawa kita dapat mencapai hal yang sama tetapi dengan kode yang lebih besar
sumber
Jika Anda tidak ingin menggunakan notasi standar, Anda juga dapat membuat / mensimulasikannya menggunakan infix dengan sesuatu seperti ini:
buat kelas untuk menampung target dan hasil Anda:
buat beberapa fungsi infiks untuk mensimulasikan operasi ternary
Maka Anda akan dapat menggunakannya seperti ini:
sumber
Pendekatan pendek lain untuk digunakan
Di sini kotlin sendiri memeriksa nilai nol dan jika itu nol maka ia melewati nilai string kosong.
sumber
Mengapa orang menggunakan sesuatu seperti ini:
ketika Anda benar-benar dapat menggunakan sesuatu seperti ini (
a
dalam hal ini adalah boolean):sumber
? and :
bertentangan dengan deklarasi nullable / type daripada jenis cek. Selain itu, saya tidak melihat alasan. Saya pikir seseorang pasti akan mempertimbangkan, jika ada inline if-else memeriksa kondisi. Mari kita tunggu dan lihat di versi mendatang.Ketika bekerja dengan apply (), biarkan terasa sangat berguna ketika berhadapan dengan operasi ternary, karena lebih elegan dan memberi Anda ruang
sumber
Dengan fungsi infix berikut, saya dapat membahas banyak kasus penggunaan umum dengan cara yang hampir sama dengan yang dapat dilakukan dengan Python:
sumber
Tidak ada operator ternary di Kotlin, yang paling tertutup adalah di bawah dua kasus,
Dokumen referensi
sumber
Dalam Kotlin jika Anda menggunakan :? Itu akan bekerja seperti jika pernyataan itu akan kembali null maka :? 0 akan mengambil 0 atau apa pun yang Anda harus menulis sisi ini.
sumber
Di Kotlin Anda dapat menggunakan operasi ternary seperti ini:
val x = if(a) "add b" else "add c"
sumber
Setelah melakukan riset terhadap ide-ide lain, saya telah menurunkan operator ternary berikut:
Contoh (jalankan di sini ):
Versi ini lancar dan tidak bertentangan dengan operator penggabungan nol.
sumber
then
bukanyes
.