Quel est l'équivalent de cette expression dans Kotlin?
a ? b : c
Ce n'est pas un code valide dans Kotlin.
kotlin
conditional-operator
Drew Noakes
la source
la source
Réponses:
Dans Kotlin, les
if
déclarations sont des expressions. Le code suivant est donc équivalent:La distinction entre expression et déclaration est ici importante. En Java / C # / JavaScript,
if
forme une instruction, ce qui signifie qu'elle ne se résout pas en une valeur. Plus concrètement, vous ne pouvez pas l'affecter à une variable.Si vous venez d'une langue où
if
est une déclaration, cela peut sembler contre nature, mais ce sentiment devrait bientôt disparaître.la source
when
.x = a==b
b + if (a) c else d
contreb + (c if (a) else d)
ce dernier nécessite des parenthèses supplémentaires. carc
n'est pas entouré par la condition etelse
.Vous pouvez définir votre propre
Boolean
fonction d'extension qui retournenull
lorsque leBoolean
estfalse
de fournir une structure similaire à l'opérateur ternaire:Cela ferait
a ? b : c
traduire une expressiona then b ?: c
comme suit:Mise à jour: Mais pour faire un changement conditionnel de type Java, vous aurez besoin de quelque chose comme ça
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
faites attention à la lambda. le calcul du contenu devrait être reportée jusqu'à ce que nous nous assuronscondition
esttrue
Celui-ci a l'air maladroit, c'est pourquoi il existe une demande très élevée pour porter l'opérateur ternaire Java dans Kotlin
la source
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
opérateur ici estelvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
est ce que vous pouvez utiliser à la place de l'expression d'opérateur ternaire
a ? b : c
.Dans Kotlin, de nombreuses déclarations de contrôle , y compris
if
,when
ou mêmetry
peut être utilisé comme expressions . Cela signifie que ceux-ci peuvent avoir un résultat qui peut être affecté à une variable, renvoyé par une fonction, etc.Syntaxiquement, aucun opérateur ternaire n'est nécessaire
Du fait des expressions de Kotlin, le langage n'a pas vraiment besoin de l'opérateur ternaire .
est ce que vous pouvez utiliser à la place de l'expression d'opérateur ternaire
a ? b : c
.Je pense que l'idée est que l'ancienne expression est plus lisible car tout le monde sait ce que
ifelse
fait, alors qu'elle? :
n'est pas claire si vous n'êtes pas déjà familier avec la syntaxe.Néanmoins, je dois admettre que je manque souvent l'opérateur ternaire le plus pratique.
Autres alternatives
quand
Vous pouvez également voir des
when
constructions utilisées dans Kotlin lorsque les conditions sont vérifiées. C'est aussi un moyen d'exprimer les cascades if-else d'une manière alternative. Ce qui suit correspond à l'exemple des OT.Extensions
Comme le montrent de nombreux bons exemples ( opérateur conditionnel ternaire de Kotlin ) dans les autres réponses, les extensions peuvent également vous aider à résoudre votre cas d'utilisation.
la source
Pour moi, j'utilise les fonctions d'extension suivantes:
Le premier retournera la valeur par défaut fournie dans le cas où l'objet est égal à null. Le second évaluera l'expression fournie dans lambda dans le même cas.
Usage:
Personnellement, le code ci-dessus est plus lisible que la
if
construction en lignela source
e.getMessage() ?: "unknown"
. Le second peut être exprimé commeobj?.lastMessage?.timestamp ?: { Date() }()
L'équivalent Java de l'opérateur ternaire
est un simple IF dans Kotlin en une seule ligne
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Cas particulier pour la comparaison Null
vous pouvez utiliser l' opérateur Elvis
la source
Il n'y a pas d'opérateur ternaire dans kotlin, car le
if else
bloc renvoie une valeurvous pouvez donc faire:
val max = if (a > b) a else b
au lieu de javamax = (a > b) ? b : c
On peut aussi utiliser la
when
construction, ça renvoie aussi de la valeur:Voici le lien pour la documentation de kotlin: Flux de contrôle: if, when, for, while
la source
la source
Quelques cas d'angle non mentionnés dans d'autres réponses.
Depuis l'apparition de takeIf dans Kotlin 1.1, l'opérateur ternaire
a ? b : c
peut également être exprimé comme ceci:Cela devient encore plus court dans le cas où c est
null
:Notez également que dans le monde Java, les vérifications nulles comme
value != null ? value : defaultValue
traduire dans Kotlin idéomatique en justevalue ?: defaultValue
.Similaire
a != null ? b : c
peut être traduit ena?.let { b } ?: c
.la source
b.takeIf { a } ?: c
plus court et plus lisible queif (a) b else c
? L'opérateur de Terneray est certainement une fonctionnalité manquante dans Kotlin car les noms de variables et la condition peuvent être longs et vous obliger à diviser la ligne, ce qui est mauvaistakeIf
toujours évalue le cas réel (icia
). Non seulement cette expression peut être calculée inutilement s'ila
se trouve qu'elle est fausse, mais vous ne pouvez pas bénéficier de modèles intelligents à laif (a is Int) { a + 3 }
.{ a }
est un lambda évalué paresseusement.b
)". Mais même{ a }
, bien que paresseux, doit être évalué pour déterminer le résultat de l'expression.Jetez un œil aux documents :
la source
Java
Équivalent à Kotlin:
la source
TÂCHE :
Prenons l'exemple suivant:
Nous avons besoin de l'équivalent suivant dans Kotlin:
SOLUTIONS :
1.A . Vous pouvez utiliser
if-expression
dans Kotlin:1.b . Cela peut être bien mieux si vous retournez ceci
if-expression
(faisons-le sansnot
):2 . L'opérateur Elvis de Kotlin
?:
peut faire un travail encore mieux:3 . Ou utilisez un
Extension function
pour laAnswer
classe correspondante :4 . En utilisant le,
Extension function
vous pouvez réduire un code grâce àElvis operator
:5 . Ou utilisez simplement l'
when
opérateur:J'espère que cela t'aides.
la source
quand remplace l'opérateur de commutation des langages de type C. Dans sa forme la plus simple, cela ressemble à ceci
la source
when
une déclaration, pas une expression. Une comparaison plus pertinente avec les expressions conditionnelles ternaires consisterait à ce que chaque branche renvoie une valeur, de sorte que l'expression when entière soit évaluée à une valeur (comme cela se produit avec les conditions ternaires).Il n'y a pas d'opérateur ternaire à Kotlin. Cela semble problématique à première vue. Mais pensez que nous pouvons le faire avec l'instruction inline if else car c'est l'expression ici. Nous devons simplement faire -
Ici, nous pouvons le faire si nous en bloquons trop. Comme-
Cette ligne est donc tellement simple et beaucoup plus lisible que l'opérateur ternaire. lorsque nous utilisons plus d'un opérateur ternaire en java, cela semble horrible. Mais ici, nous avons une syntaxe claire. même nous pouvons également l'écrire sur plusieurs lignes.
la source
Vous pouvez utiliser
var a= if (a) b else c
à la place de l'opérateur ternaire.Un autre bon concept de kotlin est l'opératrice Elvis. Vous n'avez pas besoin de vérifier null à chaque fois.
Cela retournera la longueur si b n'est pas nul sinon il exécute l'instruction du côté droit.
la source
comme l'a dit Drew Noakes, kotlin utilise l'instruction if comme expression, donc l'opérateur conditionnel ternaire n'est plus nécessaire,
mais avec la fonction d'extension et la surcharge des infixes, vous pouvez l'implémenter vous-même, voici un exemple
puis utilisez-le comme ça
la source
Une autre approche intéressante serait d'utiliser
when
:Peut être très pratique dans certains scénarios plus complexes. Et honnêtement, c'est plus lisible pour moi que
if ... else ...
la source
Vous pouvez le faire de nombreuses façons à Kotlin
Utilisation de if
Utiliser quand
Sécurité nulle
la source
Il n'y a pas d'opération ternaire à Kotlin, mais il existe des façons amusantes de contourner cela. Comme d'autres l'ont souligné, une traduction directe dans Kotlin ressemblerait à ceci:
Mais, personnellement, je pense que cela peut devenir un peu encombré et difficile à lire. Il existe d'autres options intégrées à la bibliothèque. Vous pouvez utiliser takeIf {} avec un opérateur elvis:
Ce qui se passe là-bas, c'est que la commande takeIf {} retourne votre résultat1 ou null, et l'opérateur elvis gère l'option null. Il y a quelques options supplémentaires, takeUnless {}, par exemple:
Le langage est clair, vous savez ce que ça fait.
Si c'est une condition couramment utilisée, vous pouvez également faire quelque chose d'amusant comme utiliser une méthode d'extension en ligne. Supposons que nous voulons suivre un score de jeu comme un Int, par exemple, et nous voulons toujours retourner 0 si une condition donnée n'est pas remplie:
Ok, ça semble moche. Mais considérez à quoi il ressemble quand il est utilisé:
Comme vous pouvez le voir, Kotlin offre une grande flexibilité dans la façon dont vous choisissez d'exprimer votre code. Il existe d'innombrables variantes de mes exemples et probablement des façons que je n'ai même pas encore découvert. J'espère que ça aide!
la source
takeIf
est mon option préférée en effet, très élégante.Rappelez-vous que l' opérateur ternaire et l' opérateur Elvis ont des significations distinctes dans Kotlin contrairement à de nombreuses langues populaires. Faire
expression? value1: value2
vous donnerait de mauvais mots par le compilateur Kotlin , contrairement à toute autre langue car il n'y a pas d'opérateur ternaire dans Kotlin comme mentionné dans les documents officiels . La raison en est que les instructions if, when et try-catch renvoient elles - mêmes des valeurs.Donc, faire
expression? value1: value2
peut être remplacé parL' opérateur Elvis que Kotlin a, ne fonctionne que dans le cas des variables annulable ex .:
Une compréhension plus claire peut être obtenue à partir de ces réponses .
la source
Vous pouvez utiliser l'
if
expression pour cela dans Kotlin. Dans Kotlinif
est une expression avec une valeur de résultat. Donc, à Kotlin, nous pouvons écrireet en Java, nous pouvons réaliser la même chose mais avec un code plus grand
la source
Si vous ne savez pas quoi utiliser la notation standard, vous pouvez également la créer / simuler en utilisant infix avec quelque chose comme ceci:
créer une classe pour contenir votre cible et résultat:
créer des fonctions d'infixe pour simuler une opération ternaire
Ensuite, vous pourrez l'utiliser comme ceci:
la source
Une autre approche courte à utiliser
Ici, kotlin vérifie lui-même la valeur nulle et s'il est nul, il transmet une valeur de chaîne vide.
la source
Pourquoi utiliserait-on quelque chose comme ça:
quand vous pouvez réellement utiliser quelque chose comme ça (
a
est booléen dans ce cas):la source
? and :
contredit la déclaration nullable / type plutôt qu'une vérification de type. En dehors de cela, je ne vois aucune raison. Je pense que quelqu'un aurait certainement réfléchi, s'il y avait un contrôle conditionnel if-else en ligne. Attendons de voir dans les futures versions.Lorsque vous travaillez avec apply (), laissez semble très pratique lorsqu'il s'agit d'opérations ternaires, car il est plus élégant et vous donne de la place
la source
Avec les fonctions d'infixe suivantes, je peux couvrir de nombreux cas d'utilisation courants à peu près de la même manière que cela peut être fait en Python:
la source
Il n'y a pas d'opérateur ternaire à Kotlin, les plus fermés sont les deux cas ci-dessous,
Documents de référence
la source
Dans kotlin si vous utilisez ?: Cela fonctionnera comme si l'instruction retournera null alors ?: 0 cela prendra 0 ou tout ce que vous avez écrit de ce côté.
la source
Dans Kotlin, vous pouvez utiliser une opération ternaire comme celle-ci:
val x = if(a) "add b" else "add c"
la source
Après quelques recherches sur d'autres idées, j'ai dérivé l'opérateur ternaire suivant:
Exemple (exécutez ici ):
Cette version est courante et n'entre pas en conflit avec l'opérateur de coalescence nul.
la source
then
au lieu deyes
.