Was entspricht diesem Ausdruck in Kotlin?
a ? b : c
Dies ist kein gültiger Code in Kotlin.
kotlin
conditional-operator
Drew Noakes
quelle
quelle
Antworten:
In Kotlin sind
if
Anweisungen Ausdrücke. Der folgende Code ist also äquivalent:Die Unterscheidung zwischen Ausdruck und Aussage ist hier wichtig. Bildet in Java / C # / JavaScript
if
eine Anweisung, dh, sie wird nicht in einen Wert aufgelöst. Genauer gesagt können Sie es keiner Variablen zuweisen.Wenn Sie aus einer Sprache kommen, in der
if
es sich um eine Aussage handelt, mag dies unnatürlich erscheinen, aber dieses Gefühl sollte bald nachlassen.quelle
when
.x = a==b
b + if (a) c else d
vs.b + (c if (a) else d)
Letzteres erfordert zusätzliche Klammern. weilc
ist nicht von der Bedingung und eingeschlossenelse
.Sie könnten Ihre eigene definieren
Boolean
Erweiterungsfunktion , dass die Renditen ,null
wenn dieBoolean
istfalse
eine Struktur ähnlich den ternären Operator zur Verfügung zu stellen:Dies würde einen
a ? b : c
Ausdrucka then b ?: c
wie folgt übersetzen lassen :Update: Aber um einen Java-ähnlichen bedingten Wechsel durchzuführen, benötigen Sie so etwas
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 des Inhalts sollte verschoben werden, bis wir sichercondition
sind , dass dies der Fall isttrue
Dieser sieht ungeschickt aus, weshalb eine stark nachgefragte Anforderung besteht, den ternären Java-Operator nach Kotlin zu portieren
quelle
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
Betreiber hierelvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
ist das, was Sie anstelle des ternären Operatorausdrucks verwenden können
a ? b : c
.In Kotlin, viele Steueranweisungen einschließlich
if
,when
oder sogartry
kann verwendet werden als Ausdrücke . Dies bedeutet, dass diese ein Ergebnis haben können, das einer Variablen zugewiesen, von einer Funktion usw. zurückgegeben werden kann.Syntaktisch ist kein ternärer Operator erforderlich
Aufgrund von Kotlins Ausdrücken benötigt die Sprache den ternären Operator nicht wirklich .
ist das, was Sie anstelle des ternären Operatorausdrucks verwenden können
a ? b : c
.Ich denke, die Idee ist, dass der frühere Ausdruck besser lesbar ist, da jeder weiß, was er
ifelse
tut, während er? :
eher unklar ist, wenn Sie mit der Syntax noch nicht vertraut sind.Trotzdem muss ich zugeben, dass ich oft den bequemeren ternären Operator vermisse .
Andere Alternativen
wann
Möglicherweise werden auch
when
Konstrukte in Kotlin verwendet, wenn die Bedingungen überprüft werden. Es ist auch eine Möglichkeit, If-else-Kaskaden auf alternative Weise auszudrücken. Das Folgende entspricht dem OTs-Beispiel.Erweiterungen
Wie viele gute Beispiele ( Kotlin Ternary Conditional Operator ) in den anderen Antworten zeigen, können Erweiterungen auch bei der Lösung Ihres Anwendungsfalls hilfreich sein.
quelle
Für mich selbst benutze ich folgende Erweiterungsfunktionen:
Zuerst wird der angegebene Standardwert zurückgegeben, falls das Objekt gleich null ist. Zweitens wird der Ausdruck, der in Lambda bereitgestellt wird, im selben Fall bewertet.
Verwendungszweck:
Persönlich für mich Code oben besser lesbar als
if
Konstruktion Inliningquelle
e.getMessage() ?: "unknown"
. Die zweite kann ausgedrückt werden alsobj?.lastMessage?.timestamp ?: { Date() }()
Java entspricht dem ternären Operator
ist eine einfache IF in Kotlin in einer Zeile
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Sonderfall für den Nullvergleich
Sie können den Elvis-Operator verwenden
quelle
In Kotlin gibt es keinen ternären Operator , da der
if else
Block einen Wert zurückgibtSie können also
val max = if (a > b) a else b
Folgendes tun: anstelle von Javamax = (a > b) ? b : c
Wir können auch
when
Konstruktion verwenden, es gibt auch Wert zurück:Hier ist der Link zur Kotlin-Dokumentation: Kontrollfluss: wenn, wann, für, während
quelle
quelle
Einige Eckfälle werden in anderen Antworten nicht erwähnt.
Seit dem Erscheinen von takeIf in Kotlin 1.1 kann der ternäre Operator
a ? b : c
auch folgendermaßen ausgedrückt werden:Dies wird noch kürzer, wenn c ist
null
:Beachten Sie auch, dass in der Java-Welt typische Null-Checks wie das
value != null ? value : defaultValue
Übersetzen im ideomatischen Kotlin in Justvalue ?: defaultValue
.Ähnliches
a != null ? b : c
kann übersetzt werdena?.let { b } ?: c
.quelle
b.takeIf { a } ?: c
kürzer und lesbarer alsif (a) b else c
? Der Terneray-Operator ist sicherlich ein fehlendes Feature in Kotlin, da Variablennamen und die Bedingung lang sein können und Sie die schlechte Zeile teilen könnentakeIf
immer der wahre Fall bewertet wird (hiera
). Dieser Ausdruck kann nicht nur nutzlos berechnet werden, wenna
er falsch ist, sondern Sie können auch nicht von Smart Casts à la profitierenif (a is Int) { a + 3 }
.{ a }
ist ein träge ausgewertetes Lambda.b
)". Aber auch{ a }
wenn es faul ist, muss es ausgewertet werden, um das Ergebnis des Ausdrucks zu bestimmen.Schauen Sie sich die Dokumente an :
quelle
Java
Entspricht Kotlin:
quelle
AUFGABE :
Betrachten wir das folgende Beispiel:
Wir brauchen das folgende Äquivalent in Kotlin:
LÖSUNGEN :
1.a . Sie können
if-expression
in Kotlin verwenden:1.b . Es kann viel besser sein, wenn Sie dies umdrehen
if-expression
(lassen Sie es uns ohne tunnot
):2 . Kotlins Elvis-Betreiber
?:
kann noch besser arbeiten:3 . Oder verwenden Sie ein
Extension function
für die entsprechendeAnswer
Klasse:4 . Mit dem können
Extension function
Sie einen Code reduzieren dankElvis operator
:5 . Oder verwenden Sie einfach den
when
Operator:Hoffe das hilft.
quelle
Ersetzt den Switch-Operator von C-ähnlichen Sprachen. In der einfachsten Form sieht es so aus
quelle
when
eine Aussage, keinen Ausdruck. Ein relevanterer Vergleich mit ternären bedingten Ausdrücken wäre, dass jeder Zweig einen Wert zurückgibt, so dass der gesamte When-Ausdruck einen Wert ergibt (wie dies bei ternären Bedingungen der Fall ist).In Kotlin gibt es keinen ternären Operator. Es scheint auf den ersten Blick problematisch. Aber denken Sie, wir können es mit der Inline-if-else-Anweisung tun, da dies hier Ausdruck ist. Einfach müssen wir tun -
Hier können wir sonst zu viele blockieren, wie wir brauchen. Mögen-
Diese Zeile ist also so einfach und gut lesbar als der ternäre Operator. Wenn wir in Java mehr als einen ternären Operator verwenden, scheint dies schrecklich. Aber hier haben wir eine klare Syntax. Auch wir können es in mehreren Zeilen schreiben.
quelle
Sie können
var a= if (a) b else c
anstelle des ternären Operators verwenden.Ein weiteres gutes Konzept von Kotlin ist Elvis Operater. Sie müssen nicht jedes Mal null überprüfen.
Dies gibt die Länge zurück, wenn b nicht null ist, andernfalls wird die Anweisung auf der rechten Seite ausgeführt.
quelle
Wie Drew Noakes zitiert, verwendet Kotlin die if-Anweisung als Ausdruck, sodass ein ternärer bedingter Operator nicht mehr erforderlich ist.
Mit der Erweiterungsfunktion und der Infix-Überladung können Sie dies jedoch selbst implementieren. Hier ein Beispiel
dann benutze es so
quelle
Ein weiterer interessanter Ansatz wäre
when
:Kann in einigen komplexeren Szenarien sehr praktisch sein. Und ehrlich gesagt ist es für mich lesbarer als
if ... else ...
quelle
In Kotlin kann man das auf viele Arten machen
Verwenden von if
Verwenden wann
Null Sicherheit
quelle
Es gibt keine ternäre Operation in Kotlin, aber es gibt einige unterhaltsame Möglichkeiten, dies zu umgehen. Wie andere betont haben, würde eine direkte Übersetzung in Kotlin folgendermaßen aussehen:
Aber ich persönlich denke, das kann etwas unübersichtlich und schwer zu lesen sein. In die Bibliothek sind einige andere Optionen integriert. Sie können takeIf {} mit einem elvis-Operator verwenden:
Dort passiert, dass der Befehl takeIf {} entweder Ihr Ergebnis1 oder null zurückgibt und der elvis-Operator die Option null verarbeitet. Es gibt einige zusätzliche Optionen, takeUnless {}, zum Beispiel:
Die Sprache ist klar, Sie wissen, was das tut.
Wenn es sich um eine häufig verwendete Bedingung handelt, können Sie auch eine unterhaltsame Methode wie die Verwendung einer Inline-Erweiterungsmethode verwenden. Nehmen wir an, wir möchten beispielsweise ein Spielergebnis als Int verfolgen und immer 0 zurückgeben, wenn eine bestimmte Bedingung nicht erfüllt ist:
Ok, das scheint hässlich. Aber überlegen Sie, wie es aussieht, wenn es verwendet wird:
Wie Sie sehen können, bietet Kotlin viel Flexibilität bei der Auswahl Ihres Codes. Es gibt unzählige Variationen meiner Beispiele und wahrscheinlich Wege, die ich noch nicht einmal entdeckt habe. Ich hoffe das hilft!
quelle
takeIf
ist meine Lieblingsoption in der Tat sehr elegant.Denken Sie daran, dass der ternäre Operator und der Elvis-Operator in Kotlin im Gegensatz zu vielen gängigen Sprachen unterschiedliche Bedeutungen haben. Wenn
expression? value1: value2
Sie dies tun, würde der Kotlin- Compiler im Gegensatz zu jeder anderen Sprache schlechte Worte liefern , da es in Kotlin keinen ternären Operator gibt, wie in den offiziellen Dokumenten erwähnt . Der Grund dafür ist, dass die Anweisungen if, when und try-catch selbst Werte zurückgeben.Tun
expression? value1: value2
kann also durch ersetzt werdenDer Elvis Operator dass Kotlin hat, funktioniert nur im Fall von Nullable - Variablen ex .:
Aus diesen Antworten kann ein klareres Verständnis erzielt werden .
quelle
Sie können
if
hierfür in Kotlin einen Ausdruck verwenden. In Kotlinif
ist ein Ausdruck mit einem Ergebniswert. Also können wir in Kotlin schreibenund in Java können wir dasselbe erreichen, aber mit größerem Code
quelle
Wenn Sie die Standardnotation nicht verwenden, können Sie sie auch mithilfe eines Infixes wie folgt erstellen / simulieren :
Erstellen Sie eine Klasse, um Ihr Ziel und Ergebnis zu halten:
Erstellen Sie einige Infix-Funktionen, um eine ternäre Operation zu simulieren
Dann können Sie es folgendermaßen verwenden:
quelle
Ein weiterer kurzer Ansatz
Hier prüft kotlin selbst den Nullwert und wenn es null ist, übergibt es einen leeren Zeichenfolgenwert.
quelle
Warum sollte man so etwas benutzen:
wenn Sie so etwas tatsächlich verwenden können (
a
ist in diesem Fall boolesch):quelle
? and :
widerspricht eher der Deklaration nullable / type als einer Typprüfung. Abgesehen davon sehe ich keinen Grund. Ich denke, jemand hätte definitiv darüber nachgedacht, wenn es eine Inline-If-else-Zustandsprüfung gibt. Lassen Sie uns abwarten und in zukünftigen Versionen sehen.Wenn Sie mit apply () arbeiten, scheint let sehr praktisch zu sein, wenn Sie mit ternären Operationen arbeiten, da es eleganter ist und Ihnen Raum gibt
quelle
Mit den folgenden Infix-Funktionen kann ich viele gängige Anwendungsfälle so behandeln, wie es in Python möglich ist:
quelle
In Kotlin gibt es keinen ternären Operator. Die beiden am häufigsten abgeschlossenen Fälle sind:
Referenzdokumente
quelle
In kotlin, wenn Sie ?: Verwenden , funktioniert es so, als ob die Anweisung dann null zurückgibt ?: 0 nimmt 0 oder was auch immer Sie auf dieser Seite geschrieben haben.
quelle
In Kotlin können Sie die ternäre Operation folgendermaßen verwenden:
val x = if(a) "add b" else "add c"
quelle
Nach einigen Recherchen anderer Ideen habe ich den folgenden ternären Operator abgeleitet:
Beispiel ( hier ausführen ):
Diese Version ist fließend und steht nicht in Konflikt mit dem Null-Koaleszenz-Operator.
quelle
then
anstelle von lautetyes
.