Kotlin Opérateur Conditionnel Ternaire

Quel est l'équivalent de cette expression dans Kotlin?

a ? b : c

ce code n'est pas valide à Kotlin.

256
demandé sur Drew Noakes 2013-05-02 15:07:57

26 réponses

In Kotlin, if les énoncés sont des expressions. Le code suivant est donc équivalent:

if (a) b else c

la distinction entre expression et affirmation est importante ici. Dans Java / C# / JavaScript, if forme une déclaration, ce qui signifie qu'il ne se résout pas à une valeur. Plus concrètement, vous ne pouvez pas affecter à une variable.

// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c

si vous venez d'une langue où if est une déclaration, cela pourrait sembler contre nature, mais ce sentiment devrait bientôt s'estomper.

382
répondu Drew Noakes 2017-12-31 15:33:08

vous pouvez définir votre propre Boolean fonction d'extension qui retourne null lorsque le Boolean est false pour fournir une structure similaire à l'opérateur ternaire:

infix fun <T> Boolean.then(param: T): T? = if (this) param else null

cela ferait une expression a ? b : c traduire en a then b ?: c , comme ainsi:

println(condition then "yes" ?: "no")

mise à Jour: Mais pour faire plus Java-like conditional switch vous aurez besoin de quelque chose comme cela

infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null

println(condition then { "yes" } ?: "no") faites attention à la lambda. son calcul de contenu doit être reporté jusqu'à ce que nous nous assurons que condition est true

celui-ci a l'air maladroit, c'est pourquoi il ya haute demande demandée existent pour port opérateur ternaire Java dans Kotlin

48
répondu deviant 2017-11-05 20:42:36

pour moi j'utilise les fonctions d'extension suivantes:

fun T?.or<T>(default: T): T = if (this == null) default else this 
fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this

le premier retournera la valeur par défaut fournie dans le cas où l'objet est égal à null. La seconde évaluera l'expression fournie dans lambda dans le même cas.

Utilisation:

1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }

personnellement pour moi code ci-dessus plus lisible que if construction inlining

30
répondu ruX 2015-07-08 15:41:39

Dans Kotlin, if est une expression, c'est à dire qu'elle renvoie une valeur. Donc il n'y a pas d'opérateur ternaire (condition ? then : else) , car ordinaire si fonctionne très bien dans ce rôle. source manuelle d'ici

// Traditional usage 
var max = a 
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// As expression 
val max = if (a > b) a else b
24
répondu Kris Roofe 2017-05-24 05:30:11

Il y a aucun opérateur ternaire dans kotlin, comme le if else bloc renvoie la valeur

, vous pouvez faire: val max = if (a > b) a else b au lieu de java max = (a > b) ? b : c

nous pouvons également utiliser when construction, Il valeur de retour aussi:

val max = when(a > b) {
    true -> a
    false -> b
}

voici le lien pour la documentation de kotlin: flux de contrôle: si, quand, pendant, tandis que

24
répondu romiope 2018-03-22 09:55:25

regardez le docs :

Dans Kotlin, si est une expression, c'est à dire qu'elle renvoie une valeur. Par conséquent, il pas d'opérateur ternaire (condition ? alors : d'autre), parce que ordinaire si fonctionne bien dans ce rôle.

23
répondu Li Ying 2017-12-06 11:39:46

certains cas corner 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:

b.takeIf { a } ?: c

cela devient encore plus court dans le cas c est null :

b.takeIf { a }

également noter que typique dans le monde Java null chèques comme value != null ? value : defaultValue traduire en Kotlin idéomatique à juste value ?: defaultValue .

similaire a != null ? b : c peut être traduit en a?.let { b } ?: c .

21
répondu Vadzim 2017-09-18 13:24:19

Kotlin a des Expressions

dans Kotlin, de nombreuses déclarations de contrôle dont if , when ou même try peuvent être utilisées comme expressions . Cela signifie qu'ils ont un résultat et peuvent être assignés à une variable, retournés à partir d'une fonction, etc.

syntactiquement, pas besoin d'opérateur ternaire

ayant dit cela, Kotlin n'a pas besoin de l'opérateur ternaire .

if (a) b else c est ce que vous pouvez utiliser à la place de L'expression Java a ? b : c .

je pense que l'idée est que ce dernier est moins lisible puisque tout le monde sait ce que ifelse fait, alors que ? : est plutôt incommode si vous n'êtes pas familiar avec la syntaxe déjà. Bien que je doive admettre que je manque souvent l'opérateur ternaire plus commode.

Autres Alternatives

quand

vous pourriez également voir un lot when constructions chaque fois que les conditions sont vérifiées dans Kotlin. C'est aussi une façon d'exprimer SI-AUTREMENT cascades d'une manière alternative. La suite correspond à votre exemple.

when(a) {
    true -> b
    false -> c
}

Extensions

Comme beaucoup de bons exemples ( Kotlin Opérateur Conditionnel Ternaire ) dans les autres réponses montrent, les extensions peuvent également être un moyen d'aller.

17
répondu s1m0nw1 2018-08-17 19:36:58

Java

int temp = a ? b : c;

équivalent de Kotlin"

var temp = if (a) b else c
14
répondu doubleThunder 2017-12-06 10:59:01

remplace l'opérateur de commutateur des langages de type C. Dans la forme la plus simple, il ressemble à ceci

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}
12
répondu Guruprasath 2017-05-23 10:21:38

il n'y a pas d'opérateur ternaire à Kotlin. Cela semble problématique à première vue. Mais pense que nous pouvons le faire avec inline Si autre déclaration parce que c'est l'expression ici. Tout simplement nous devons faire -

var number = if(n>0) "Positive" else "Negetive"

ici, on peut faire autrement si on en bloque trop. Comme -

var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"

donc cette ligne est si simple et beaucoup plus lisible que l'opérateur ternaire. lorsque nous utilisons plus d'un opérateur ternaire en java, il semble horrible. Mais ici, nous avons un clair de la syntaxe. même on peut l'écrire en plusieurs ligne trop.

11
répondu HM Nayem 2017-06-09 22:40:26

comme Drew Noakes Cité, kotlin utiliser si la déclaration comme expression, opérateur conditionnel ternaire N'est plus nécessaire,

mais avec la fonction extension et la surcharge infix, vous pouvez mettre en œuvre vous-même, voici un exemple

infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value)

class TernaryExpression<out T>(val flag: Boolean, val truly: T?) {
    infix fun <T> or(falsy: T?) = if (flag) truly else falsy
}

alors utilisez - le comme ceci

val grade = 90
val clazz = (grade > 80) then "A" or "B"
7
répondu Minami 2017-06-07 09:20:32

une Autre approche intéressante serait d'utiliser when :

when(a) {
  true -> b
  false -> b
}

peut être très pratique dans certains scénarios plus complexes. Et honnêtement, c'est plus lisible pour moi que if ... else ...

6
répondu Grzegorz Piwowarek 2017-12-05 20:51:54

Vous pouvez faire beaucoup de chemin dans Kotlin

  1. utilisant if

    if(a) b else c
    
  2. en utilisant "quand

    when (a) { 
        true -> print("value b") 
        false -> print("value c") 
        else -> {  
            print("default return in any other case") 
        } 
    }
    
  3. Sécurité Nulle

    val a = b ?: c
    
6
répondu Rajesh Dalsaniya 2017-12-06 11:00:28

il n'y a pas d'opérateur ternaire à Kotlin, car il y a l'expression if:

var d = if (a) b else c
5
répondu dey 2018-07-27 14:24:45

selon la documentation de Kotlin pour moi-même, j'utilise le code suivant:

 val max = if (a > b) a else b

et:

when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> { // Note the block
      print("x is neither 1 nor 2")
  }
}

si vous voulez en savoir plus, cliquez sur le lien suivant: flux de contrôle: si, quand, pendant, tandis que

4
répondu Ranjith Rayapati 2018-03-22 09:52:58

vous pouvez utiliser l'expression if pour cela dans Kotlin. En Kotlin if est une expression avec une valeur de résultat. Donc à Kotlin on peut écrire

fun max(a: Int, b: Int) = if (a > b) a else b

et en Java nous pouvons obtenir le même mais avec un code plus grand

int max(int a, int b) {
return a > b ? a : b
}
3
répondu Gulzar Bhat 2018-01-06 09:41:22

il n'y a pas d'opération ternaire à Kotlin, mais il y a des façons amusantes de contourner cela. Comme d'autres l'ont fait remarquer, une traduction directe en Kotlin ressemblerait à ceci:

val x = if (condition) result1 else result2

Mais, personnellement, je pense que cela peut être un peu encombré et difficile à lire. Il y a d'autres options intégrées dans la bibliothèque. Vous pouvez utiliser takeIf {} avec un opérateur elvis:

val x = result1.takeIf { condition } ?: result2

ce qui se passe là - bas est que le takeIf { } commande renvoie soit votre result1 ou nulle, et la elvis opérateur gère la null. Il y a d'autres options, takeUnless { }, par exemple:

val x = result1.takeUnless { condition } ?: result2

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 l'utilisation d'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 un condition n'est pas remplie:

inline fun Int.zeroIfFalse(func: () -> Boolean) : Int = if (!func.invoke()) 0 else this     

Ok, ça a l'air moche. Mais pensez à l'apparence quand il est utilisé:

var score = 0
val twoPointer = 2
val threePointer = 3

score += twoPointer.zeroIfFalse { scoreCondition } 
score += threePointer.zeroIfFalse { scoreCondition } 

comme vous pouvez le voir, Kotlin offre beaucoup de flexibilité dans la façon dont vous choisissez d'exprimer votre code. Il y a d'innombrables variantes de mes exemples et probablement des façons que je n'ai pas encore découvertes. J'espère que cela aide!

3
répondu pranalli 2018-02-04 21:06:04

une Autre approche

val value : String = "Kotlin"

value ?: ""

ici kotlin lui-même vérifie la valeur nulle et si elle est nulle alors elle passe la valeur de chaîne vide.

2
répondu Vinod Pattanshetti 2017-09-22 09:32:12

pourquoi utiliserait-on quelque chose comme ceci:

when(a) {
  true -> b
  false -> b
}

quand vous pouvez réellement utiliser quelque chose comme ceci ( a est booléen dans ce cas):

when {
  a -> b
  else -> b
}
2
répondu ZZ 5 2018-07-24 11:40:49

à Kotlin, il y a sans opérateur ternaire .

Dans Kotlin, si est une expression, c'est à dire qu'elle renvoie une valeur.

il N'y a donc pas d'opérateur ternaire (condition ? alors : d'autre), parce que ordinaire si fonctionne bien dans ce rôle.

équivalent en Kotlin

var a = if (a) b else c

document de référence : Débit de commande: si, quand, pendant, tandis que

1
répondu Gowtham Subramaniam 2018-03-22 07:15:22

avec les fonctions infix suivantes, je peux couvrir de nombreux cas d'utilisation commune à peu près de la même manière que cela peut être fait en Python:

class TestKotlinTernaryConditionalOperator {

    @Test
    fun testAndOrInfixFunctions() {
        Assertions.assertThat(true and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(false and "yes" or "no").isEqualTo("no")

        Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat("" and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(0 and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes")
        @Suppress("CAST_NEVER_SUCCEEDS")
        Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no")
    }
}

infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null
infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null
infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null
infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null
infix fun <E> E?.or(other: E?): E? = this ?: other
0
répondu Nicolas Cornette 2017-11-23 09:46:57

utiliser soit if-else conditional statement soit when operator comme suit""

when(a) {
  true -> b
  false -> b
}
0
répondu cleaning agent 2018-05-06 03:05:49

il n'y a pas d'opérateur ternaire à Kotlin, les plus fermés sont les deux cas ci-dessous,

  • Si d'autre que l'expression de l'énoncé

val a = true if(a) print("A is true") else print("A is false")

  • Elvis opérateur

si l'expression à gauche de ?: n'est pas null, la elvis opérateur retourne, sinon elle renvoie l'expression à droite. Note que le côté droit de l'expression est évaluée uniquement si la gauche side est nul.

 val name = node.getName() ?: throw IllegalArgumentException("name expected")

"1519210920 Référence de" docs

0
répondu JTeam 2018-07-02 10:58:51

exemple: var énergie: Int = données?.get (position)?.de l'énergie?.toInt ()?: 0

à kotlin si vous utilisez ?: cela fonctionnera comme si l'instruction return null, ?: 0 il faudra 0 ou ce que vous avez à écrire ce côté.

0
répondu abhilasha Yadav 2018-07-19 06:38:58

quand on travaille avec apply (), il semble très pratique quand on travaille avec des opérations ternaires, car il est plus élégant et vous donne de la place

val columns: List<String> = ...
val band = Band().apply {
    name = columns[0]
    album = columns[1]
    year = columns[2].takeIf { it.isNotEmpty() }?.let { it.toInt() } ?: 0
}
0
répondu Juan Mendez 2018-08-10 10:03:34