884 Stimmen

Kotlin Ternärer bedingter Operator

Was ist die Entsprechung dieses Ausdrucks in Kotlin?

a ? b : c

Dies ist kein gültiger Code in Kotlin.

1163voto

Drew Noakes Punkte 282438

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.

178voto

s1m0nw1 Punkte 67790

TL;DR

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.

Syntaktisch gesehen besteht keine Notwendigkeit für den ternären Operator

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.

107voto

deviant Punkte 3380

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.

61voto

Raymond Chenon Punkte 10104

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

51voto

Vadzim Punkte 22887

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.com

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.

Powered by:

X