?:
Örneğin bu durumda ne olduğunu anlayamıyorum
val list = mutableList ?: mutableListOf()
ve neden buna değiştirilebilir
val list = if (mutableList != null) mutableList else mutableListOf()
?:
Örneğin bu durumda ne olduğunu anlayamıyorum
val list = mutableList ?: mutableListOf()
ve neden buna değiştirilebilir
val list = if (mutableList != null) mutableList else mutableListOf()
Yanıtlar:
TL; DR: Ortaya çıkan nesne referansı [birinci işlenen] değilse null
, döndürülür. Aksi takdirde ikinci işlenenin değeri (olabilir null
) döndürülür
Elvis operatör birçok programlama dilleri, örneğin KOTLIN aynı zamanda Groovy veya C # parçasıdır. Wikipedia tanımını oldukça doğru buluyorum :
Bazı bilgisayar programlama dillerinde, Elvis operatörü
?:
, bu işlenen ise ilk işlenenini döndüren ve aksi takdirde ikinci işlenenini değerlendirip döndüren bir ikili operatördürtrue
. Bu ise üçlü koşullu operatörün varyantı ,? :
bu diller (ve diğerleri) 'de bulunan Elvis operatörü ihmal ikinci işlenen ile üçlü operatör .
Aşağıdakiler özellikle Kotlin için geçerlidir:
Bazı bilgisayar programlama dilleri bu operatör için farklı anlamlara sahiptir. İlk işlenenin bir mantıksal değerle sonuçlanması yerine, bir nesne başvurusu ile sonuçlanması gerekir . Ortaya çıkan nesne başvurusu değilse
null
, döndürülür. Aksi takdirde ikinci işlenenin değeri (olabilirnull
) döndürülür.
Bir örnek:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
elvis operator
Başka bir şeye daha da indirgenebileceğini hiç düşünmemiştim . Güzel! Ve güzel açıklama, teşekkür ederim!
Elvis Operatör Bir kolon ile bir soru işareti ile temsil edilir: ?:
ve bu sözdizimi ile kullanılabilir:
first operand ?: second operand
Consise kodu yazmanıza olanak tanır ve şu şekilde çalışır:
Eğer first operand
boş değil , o zaman iade edilecektir. O takdirde null , daha sonra second operand
iade edilecektir. Bu, sağlanan değer null ise null yapılamayan bir değer sağlayacağınız için bir ifadenin boş değer döndürmeyeceğini garanti etmek için kullanılabilir.
Örneğin (Kotlin'de):
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"
}
Bu durumda, hesaplanan değeri getPotentialNull
boş değilse, döndürülür retrieveString
; Boş ise, "Secondary Not-Null String"
bunun yerine ikinci ifade döndürülür.
Ayrıca sağ taraftaki ifade değerlendirilir unutmayın sadece sol taraftaki ise boş .
Kotlin'de, bir ifade gibi herhangi second operand
bir throw Exception
ifadeyi kullanabilirsiniz.
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Elvis Operator adı, ünlü Amerikalı şarkıcı Elvis Presley'den geliyor . Saç modeli soru işaretine benziyor
Kaynak: Wojda, I. Moskala, M. Kotlin ile Android Geliştirme. 2017. Packt Yayıncılık
Buna Elvis operatörü denir ve öyle ... Sorunuzda tam olarak anlattığınız gibi. Sol tarafı bir null
değer ise, bunun yerine sağ tarafı bir geri dönüş olarak döndürür. Aksi takdirde sadece sol taraftaki değeri döndürür.
a ?: b
sadece kısaltmasıdır if (a != null) a else b
.
Türlerle ilgili birkaç örnek daha:
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
Tanıma bir göz atalım :
Boş değer atanabilir bir referansımız olduğunda, "r boş değilse, kullanın, aksi takdirde boş olmayan bir x değeri kullanın" diyebiliriz:
?:
(Elvis) operatörü ayrıntı önler ve gerçekten özlü kodunuzu yapar.
Örneğin, birçok koleksiyon uzantısı işlevi null
yedek olarak geri döner .
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:
size, birden çok geri dönüş katmanınız olsa bile, yedek durumu büyük ölçüde ele almanın bir yolunu sunar. Öyleyse, burada olduğu gibi, çarpma Elvis operatörlerini zincirleyebilirsiniz:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Eğer aynı şeyi if else ile ifade ederseniz, okunması daha zor olan çok daha fazla kod olurdu.
Basitçe şunu söyleyebiliriz, iki elin var. Bilmek istiyorsun, sol elin şu anda çalışıyor mu? Sol el çalışmıyorsa, return
empty
yoksabusy
Java örneği:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Kotlin için örnek:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
Kotlin'deki elvis operatörü, boş güvenlik için kullanılır.
x = a ?: b
Yukarıdaki kodda, x
değerini atanacaktır a
bir değilse null
ve b
eğer a
olduğunu null
.
Elvis operatörünü kullanmadan eşdeğer kotlin kodu aşağıdadır:
x = if(a == null) b else a