Was ist die Entsprechung dieses Ausdrucks in Kotlin?
a ? b : c
Dies ist kein gültiger Code in Kotlin.
Was ist die Entsprechung dieses Ausdrucks in Kotlin?
a ? b : c
Dies ist kein gültiger Code in Kotlin.
In Kotlin, if
Aussagen sind Ausdrücke. Der folgende Code ist also äquivalent:
if (a) b else c
Die Unterscheidung zwischen Ausdruck und Aussage ist hier wichtig. In Java/C#/JavaScript, if
bildet eine Anweisung, was bedeutet, dass sie nicht in einen Wert aufgelöst wird. Konkreter ausgedrückt: Sie können sie nicht einer Variablen zuweisen.
// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c
Wenn Sie aus einer Sprache kommen, in der if
eine Aussage ist, mag dies unnatürlich erscheinen, aber dieses Gefühl sollte sich bald legen.
if (a) b else c
^ können Sie anstelle des ternären Operatorausdrucks verwenden a ? b : c
was die Kotlin-Syntax nicht zulässt.
In Kotlin sind viele Kontrollanweisungen, wie z.B. if
, when
und sogar try
kann verwendet werden als Ausdrücke . Folglich können diese Anweisungen ein Ergebnis haben, das einer Variablen zugewiesen oder von einer Funktion zurückgegeben werden kann usw.
Infolge der Ausdrücke von Kotlin ist die Sprache braucht den ternären Operator nicht wirklich .
if (a) b else c
können Sie anstelle des ternären Operatorausdrucks verwenden a ? b : c
.
Ich denke, die Idee ist, dass der erste Ausdruck besser lesbar ist, da jeder weiß, was ifelse
tut, während ? :
ist ziemlich unklar, wenn man nicht bereits mit der Syntax vertraut ist.
Dennoch muss ich zugeben, dass ich oft Miss der bequemere ternäre Operator.
Andere Alternativen
wenn
Sie können auch sehen when
Konstrukte, die in Kotlin verwendet werden, wenn Bedingungen geprüft werden. Es ist auch eine Möglichkeit, if-else-Kaskaden auf eine alternative Weise auszudrücken. Das Folgende entspricht dem OTs-Beispiel.
when(a) {
true -> b
false -> c
}
Erweiterungen
Wie viele gute Beispiele ( Kotlin Ternärer bedingter Operator ) in den anderen Antworten zeigen, können Erweiterungen auch bei der Lösung Ihres Anwendungsfalls helfen.
Sie können Ihre eigene Boolean
Erweiterungsfunktion, die Folgendes zurückgibt null
wenn die Boolean
es false
um eine ähnliche Struktur wie der ternäre Operator zu schaffen:
infix fun <T> Boolean.then(param: T): T? = if (this) param else null
Dies würde eine a ? b : c
Ausdruck übersetzen in a then b ?: c
, etwa so:
println(condition then "yes" ?: "no")
更新した: Aber um eine Java-ähnliche bedingte Umschaltung vorzunehmen, brauchen Sie etwas wie das
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
Achten Sie auf das Lambda. Die Berechnung seines Inhalts sollte verschoben werden, bis wir sicher sind, dass condition
es true
Dieser sieht unbeholfen aus, Deshalb gibt es eine große Nachfrage, den ternären Operator von Java nach Kotlin zu portieren.
Das Java-Äquivalent zum ternären Operator
a ? b : c
ist ein einfaches IF in Kotlin in einer Zeile
if(a) b else c
Es gibt keinen ternären Operator (Bedingung ? dann : sonst), denn normales if funktioniert in dieser Rolle gut.
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Spezialfall für den Null-Vergleich
können Sie die Elvis Betreiber
if ( a != null ) a else b
// equivalent to
a ?: b
Einige Eckkoffer die in anderen Antworten nicht erwähnt wurden.
Seit dem Erscheinen von takeIf en Kotlin 1.1 der ternäre Operator a ? b : c
kann auch folgendermaßen ausgedrückt werden:
b.takeIf { a } ?: c
Dies wird noch kürzer, wenn c gleich null
:
b.takeIf { a }
Ein allgemeiner Workaround, um b
faul ausgewertet:
true.takeIf { a }?.let { b } ?: c
Beachten Sie auch, dass in der Java-Welt typische Null-Checks wie value != null ? value : defaultValue
in ideomatisches Kotlin übersetzen, um nur value ?: defaultValue
.
Ähnlich a != null ? b : c
kann übersetzt werden mit a?.let { b } ?: c
.
Siehe auch Boolean?.ifTrue
Vorschlag in KT-6938 was es ermöglichen sollte, die a ? b : null
Ausdrücke zu a.ifTrue { b }
ohne vorschnelle Bewertung der b
.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.