TL; DR: Wenn die resultierende Objektreferenz [erster Operand] nicht vorhanden ist null, wird sie zurückgegeben. Andernfalls wird der Wert des zweiten Operanden (möglicherweise null) zurückgegeben
Der Elvis-Operator ist Teil vieler Programmiersprachen, z. B. Kotlin, aber auch Groovy oder C #. Ich finde die Wikipedia- Definition ziemlich genau:
In bestimmten Computerprogrammiersprachen ist der Elvis-Operator?: ein binärer Operator , der seinen ersten Operanden zurückgibt, wenn dieser Operand ist true, und ansonsten seinen zweiten Operanden auswertet und zurückgibt. Es ist eine Variante des ternären bedingten Operators , ? :der in diesen Sprachen (und vielen anderen) vorkommt: Der Elvis-Operator ist der ternäre Operator, dessen zweiter Operand weggelassen wird .
Folgendes gilt insbesondere für Kotlin:
Einige Computerprogrammiersprachen haben für diesen Operator eine andere Semantik. Anstatt dass der erste Operand zu einem Booleschen Wert führen muss, muss er zu einer Objektreferenz führen . Wenn die resultierende Objektreferenz nicht vorhanden ist null, wird sie zurückgegeben. Andernfalls wird der Wert des zweiten Operanden (möglicherweise null) zurückgegeben.
Ein Beispiel:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
Das ist wirklich cool. Ich hätte nie gedacht, elvis operatordass ich weiter auf etwas anderes reduziert werden könnte. nett! Und schöne Erklärung, danke!
Sud007
83
Der Elvis-Operator wird durch ein Fragezeichen gefolgt von einem Doppelpunkt dargestellt. ?:Er kann mit folgender Syntax verwendet werden:
first operand ?: second operand
Es ermöglicht Ihnen das Schreiben eines konsistenten Codes und funktioniert als solcher:
Wenn first operandnicht null ist , wird es zurückgegeben. Wenn es null ist , second operandwird das zurückgegeben. Dies kann verwendet werden, um sicherzustellen, dass ein Ausdruck keinen Nullwert zurückgibt, da Sie einen nicht nullbaren Wert angeben, wenn der angegebene Wert null ist.
Zum Beispiel (in Kotlin):
fun retrieveString():String{//Notice that this type isn't nullableval nullableVariable:String?= getPotentialNull()//This variable may be nullreturn nullableVariable ?:"Secondary Not-Null String"}
Wenn in diesem Fall der berechnete Wert von getPotentialNullnicht null ist, wird er von zurückgegeben retrieveString. Wenn es null ist, "Secondary Not-Null String"wird stattdessen der zweite Ausdruck zurückgegeben.
Beachten Sie auch, dass der Ausdruck auf der rechten Seite nur ausgewertet wird , wenn der Ausdruck auf der linken Seite null ist .
In Kotlin können Sie einen beliebigen Ausdruck als verwenden second operand, z. B. einen throw ExceptionAusdruck
return nullVariable ?:throwIllegalResponseException("My inner function returned null! Oh no!")
Der Name Elvis Operator stammt von dem berühmten amerikanischen Sänger Elvis Presley . Seine Frisur ähnelt einem Fragezeichen
Quelle: Wojda, I. Moskala, M. Android-Entwicklung mit Kotlin. 2017. Packt Publishing
Plus 1 für die Veranschaulichung von Herrn Presley
s1m0nw1
7
? :) (sehen Sie es als Elvis lächelnd)
LeoColman
1
Nach einer Weile kann ich nicht verstehen, warum es Elvis Operator heißt. Ihre Illustration hat mich wissen lassen, warum es Elvis Operator heißt. :)
Yohanes AI
Ist die Geschichte über Elvis tatsächlich wahr? haha
Hillcow
@Kerooker Er lächelt nicht,?: | wird besser IMO sein.
Ahmed Galal
37
Dies wird als Elvis-Operator bezeichnet und tut es ... Genau das, was Sie in Ihrer Frage beschrieben haben. Wenn die linke Seite ein nullWert ist, wird stattdessen die rechte Seite zurückgegeben, sozusagen als Fallback. Andernfalls wird nur der Wert auf der linken Seite zurückgegeben.
a ?: bist nur eine Abkürzung für if (a != null) a else b.
Einige weitere Beispiele mit Typen:
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
Wenn wir eine nullfähige Referenz r haben, können wir sagen "Wenn r nicht null ist, verwenden Sie es, andernfalls verwenden Sie einen Nicht-Null-Wert x":
Der ?:Operator (Elvis) vermeidet Ausführlichkeit und macht Ihren Code wirklich präzise.
Beispielsweise werden viele Funktionen zur Sammlungserweiterung nullals Fallback zurückgegeben.
listOf(1,2,3).firstOrNull { it ==4}?:throwIllegalStateException("Ups")
?:bietet Ihnen die Möglichkeit, den Fallback-Fall auch bei mehreren Fallback-Schichten elegant zu behandeln. Wenn ja, können Sie einfach Elvis-Operatoren wie hier verketten:
val l = listOf(1,2,3)val x = l.firstOrNull { it ==4}?: l.firstOrNull { it ==5}?:throwIllegalStateException("Ups")
Wenn Sie dasselbe mit wenn sonst ausdrücken würden, wäre es viel mehr Code, der schwerer zu lesen ist.
Wir können einfach sagen, dass Sie zwei Hände haben. Sie möchten wissen, ob Ihre linke Hand gerade arbeitet? Wenn die linke Hand nicht funktioniert, returnemptysonstbusy
Beispiel für Java:
private int a;if(a !=null){
println("a is not null, Value is: "+a)}else{
println("a is null")}
Beispiel für Kotlin:
val a :Int=5val l :Int=if(a !=null) a.length else"a is null"
Xwird immer noch sein, nullwenn beide Aund Bbewertennull
Wenn Sie Ximmer sein möchten non-null, stellen Sie daher sicher, dass Bes sich immer um eine handelt non-nulloder dass Bimmer ausgewertet wird, non-nullob es sich um eine Funktion oder einen Ausdruck handelt.
Antworten:
TL; DR: Wenn die resultierende Objektreferenz [erster Operand] nicht vorhanden ist
null
, wird sie zurückgegeben. Andernfalls wird der Wert des zweiten Operanden (möglicherweisenull
) zurückgegebenDer Elvis-Operator ist Teil vieler Programmiersprachen, z. B. Kotlin, aber auch Groovy oder C #. Ich finde die Wikipedia- Definition ziemlich genau:
Folgendes gilt insbesondere für Kotlin:
Ein Beispiel:
quelle
elvis operator
dass ich weiter auf etwas anderes reduziert werden könnte. nett! Und schöne Erklärung, danke!Der Elvis-Operator wird durch ein Fragezeichen gefolgt von einem Doppelpunkt dargestellt.
?:
Er kann mit folgender Syntax verwendet werden:Es ermöglicht Ihnen das Schreiben eines konsistenten Codes und funktioniert als solcher:
Wenn
first operand
nicht null ist , wird es zurückgegeben. Wenn es null ist ,second operand
wird das zurückgegeben. Dies kann verwendet werden, um sicherzustellen, dass ein Ausdruck keinen Nullwert zurückgibt, da Sie einen nicht nullbaren Wert angeben, wenn der angegebene Wert null ist.Zum Beispiel (in Kotlin):
Wenn in diesem Fall der berechnete Wert von
getPotentialNull
nicht null ist, wird er von zurückgegebenretrieveString
. Wenn es null ist,"Secondary Not-Null String"
wird stattdessen der zweite Ausdruck zurückgegeben.Beachten Sie auch, dass der Ausdruck auf der rechten Seite nur ausgewertet wird , wenn der Ausdruck auf der linken Seite null ist .
In Kotlin können Sie einen beliebigen Ausdruck als verwenden
second operand
, z. B. einenthrow Exception
AusdruckDer Name Elvis Operator stammt von dem berühmten amerikanischen Sänger Elvis Presley . Seine Frisur ähnelt einem Fragezeichen
Quelle: Wojda, I. Moskala, M. Android-Entwicklung mit Kotlin. 2017. Packt Publishing
quelle
Dies wird als Elvis-Operator bezeichnet und tut es ... Genau das, was Sie in Ihrer Frage beschrieben haben. Wenn die linke Seite ein
null
Wert ist, wird stattdessen die rechte Seite zurückgegeben, sozusagen als Fallback. Andernfalls wird nur der Wert auf der linken Seite zurückgegeben.a ?: b
ist nur eine Abkürzung fürif (a != null) a else b
.Einige weitere Beispiele mit Typen:
quelle
a != null ? a : b
Werfen wir einen Blick auf die Definition :
Der
?:
Operator (Elvis) vermeidet Ausführlichkeit und macht Ihren Code wirklich präzise.Beispielsweise werden viele Funktionen zur Sammlungserweiterung
null
als Fallback zurückgegeben.?:
bietet Ihnen die Möglichkeit, den Fallback-Fall auch bei mehreren Fallback-Schichten elegant zu behandeln. Wenn ja, können Sie einfach Elvis-Operatoren wie hier verketten:Wenn Sie dasselbe mit wenn sonst ausdrücken würden, wäre es viel mehr Code, der schwerer zu lesen ist.
quelle
Wir können einfach sagen, dass Sie zwei Hände haben. Sie möchten wissen, ob Ihre linke Hand gerade arbeitet? Wenn die linke Hand nicht funktioniert,
return
empty
sonstbusy
Beispiel für Java:
Beispiel für Kotlin:
quelle
Wenn die linke Seite von Elvis aus irgendeinem Grund null zurückgibt, wird grundsätzlich stattdessen die rechte Seite zurückgegeben.
dh
Also, wenn die Zahl nicht Null ist , wird es drucken Nummer, andernfalls wird gedruckt „Number ist null“.
quelle
Der elvis-Operator in Kotlin wird aus Sicherheitsgründen verwendet.
Im obigen Code
x
wird der Wert zugewiesen,a
wenn a nicht istnull
undb
wenna
istnull
.Der entsprechende Kotlin-Code ohne Verwendung des elvis-Operators ist unten aufgeführt:
quelle
Eine kleine Ergänzung ist dies
X
wird immer noch sein,null
wenn beideA
undB
bewertennull
Wenn Sie
X
immer sein möchtennon-null
, stellen Sie daher sicher, dassB
es sich immer um eine handeltnon-null
oder dassB
immer ausgewertet wird,non-null
ob es sich um eine Funktion oder einen Ausdruck handelt.quelle