Je travaille avec Java depuis quelques années, mais jusqu'à récemment, je n'ai pas rencontré cette construction:
int count = isHere ? getHereCount(index) : getAwayCount(index);
C'est probablement une question très simple, mais quelqu'un peut-il l'expliquer? Comment le lire? Je suis presque sûr de savoir comment cela fonctionne.
- si
isHere
est vrai,getHereCount()
est appelé, - si
isHere
est fauxgetAwayCount()
est appelé.
Correct? Comment s'appelle cette construction?
java
syntax
ternary-operator
conditional-operator
mainstringargs
la source
la source
Réponses:
Oui, c'est une forme abrégée de
C'est ce qu'on appelle l' opérateur conditionnel . Beaucoup de gens l'appellent (à tort) l'opérateur ternaire , car c'est le seul opérateur ternaire (trois arguments) en Java, C, C ++ et probablement dans de nombreux autres langages. Mais en théorie, il pourrait y avoir un autre opérateur ternaire, alors qu'il ne peut y avoir qu'un seul opérateur conditionnel .
Le nom officiel est donné dans la spécification du langage Java :
Notez que les deux branches doivent conduire à des méthodes avec des valeurs de retour:
Donc, si
doSomething()
etdoSomethingElse()
sont des méthodes void, vous ne pouvez pas compresser ceci:dans ceci:
Mots simples:
la source
the
dans l'italique dethe ternary operator
, et c'est ce qu'il veut dire est erroné, non pas queternary operator
c'est faux. L' opérateur ternaire implique que, comme Michael dit, il est le seul, ce qui pourrait conduire à supposer qu'il ne peut y avoir d' autres opérateurs ternaires, ce qui est ce que Michael dit est erroné, et je suis d' accord, ce serait être une hypothèse erronée.D'autres y ont répondu dans une mesure raisonnable, mais souvent sous le nom d '«opérateur ternaire».
Étant le pédant que je suis, je voudrais préciser que le nom de l'opérateur est l'opérateur conditionnel ou "opérateur conditionnel?:". C'est un opérateur ternaire (en ce sens qu'il a trois opérandes) et il se trouve être le seul opérateur ternaire en Java pour le moment.
Cependant, la spécification est assez claire que son nom est l'opérateur conditionnel ou "opérateur conditionnel?:" Pour être absolument sans ambiguïté. Je pense qu'il est plus clair de l'appeler par ce nom, car cela indique le comportement de l'opérateur dans une certaine mesure (évaluation d'une condition) plutôt que simplement le nombre d'opérandes dont il dispose.
la source
&&
l'opérateur conditionnel-and, et||
l'opérateur conditionnel-or, mais n'utilise que "l'opérateur conditionnel" pour?:
.Selon la spécification Sun Java , il s'appelle l'opérateur conditionnel. Voir la section 15.25. Vous avez raison sur ce qu'il fait.
L'opérateur conditionnel? : utilise la valeur booléenne d'une expression pour décider laquelle des deux autres expressions doit être évaluée.
L'opérateur conditionnel est syntaxiquement associatif à droite (il regroupe de droite à gauche), de sorte que a? B: c? D: e? F: g signifie la même chose que a? B: (c? D: (e? F :g)).
L'opérateur conditionnel a trois expressions d'opérande; ? apparaît entre les première et deuxième expressions, et: apparaît entre les deuxième et troisième expressions.
La première expression doit être de type booléen ou booléen, sinon une erreur de compilation se produit.
la source
veux dire :
la source
Pas tout à fait correct, pour être précis:
Ce «rendu» est très important. Cela signifie que les méthodes doivent renvoyer une valeur et que cette valeur doit être affectée quelque part.
De plus, ce n'est pas exactement équivalent syntaxiquement à la version if-else. Par exemple:
Si codé avec if-else donnera toujours plus de bytecode.
la source
Ternaire, conditionnel; tomate, tomate. Ce qui est vraiment utile, c'est l'initialisation des variables. Si (comme moi) vous aimez initialiser les variables là où elles sont définies, l'opérateur ternaire conditionnel (car c'est les deux) vous permet de le faire dans les cas où il y a une conditionnalité sur sa valeur. Particulièrement remarquable dans les domaines finaux, mais également utile ailleurs.
par exemple:
Sans cet opérateur - quel que soit son nom - il faudrait rendre le champ non final ou écrire une fonction simplement pour l'initialiser. En fait, ce n'est pas correct - il peut toujours être initialisé en utilisant if / else, du moins en Java. Mais je trouve cela plus propre.
la source
Si la condition est,
true
évaluez la première expression. Si la condition estfalse
, évaluez la deuxième expression.C'est ce qu'on appelle l' opérateur conditionnel et c'est un type d' opération ternaire .
la source
Cette construction est appelée opérateur ternaire en informatique et techniques de programmation.
Et Wikipedia suggère l'explication suivante:
Non seulement en Java, cette syntaxe est disponible dans PHP, Objective-C aussi.
Dans le lien suivant , il donne l'explication suivante, ce qui est assez bon pour le comprendre:
Cela peut être lisible pour certaines conditions logiques qui ne sont pas trop complexes, sinon il est préférable d'utiliser le bloc If-Else avec la combinaison prévue de logique conditionnelle.
Nous pouvons simplifier les blocs If-Else avec cet opérateur ternaire pour une ligne de déclaration de code.
Par exemple:
Peut être égal à ce qui suit:
Donc, si nous nous référons à votre déclaration:
C'est en fait l'équivalent à 100% du bloc If-Else suivant :
C'est tout!
J'espère que cela a été utile à quelqu'un!
À votre santé!
la source
Correct. C'est ce qu'on appelle l' opérateur ternaire . Certains l'appellent également l' opérateur conditionnel .
la source
Son opérateur ternaire (? :)
la source
Vous pourriez être intéressé par une proposition pour certains nouveaux opérateurs similaires à l'opérateur conditionnel. Les opérateurs null-safe activeront un code comme celui-ci:
Ce serait particulièrement pratique lorsque le déballage automatique a lieu.
Il a été sélectionné pour un examen plus approfondi dans le cadre du «Project Coin» de JDK 7.
la source
En fait, cela peut prendre plus de 3 arguments. Par exemple, si nous voulons vérifier si un nombre est positif, négatif ou nul, nous pouvons le faire:
ce qui est mieux que d'utiliser if, else if, else.
la source
C'est l'opérateur conditionnel, et c'est plus qu'une simple manière concise d'écrire des instructions if.
Puisqu'il s'agit d'une expression qui renvoie une valeur, elle peut être utilisée dans le cadre d'autres expressions.
la source
Oui vous avez raison. ?: est généralement appelé «opérateur conditionnel ternaire», souvent appelé simplement «opérateur ternaire». Il s'agit d'une version abrégée du conditionnel if / else standard.
Opérateur conditionnel ternaire
la source
Il se trouve que j'aime vraiment cet opérateur, mais le lecteur doit être pris en considération.
Vous devez toujours équilibrer la compacité du code avec le temps passé à le lire, et en ce sens qu'il présente de graves défauts.
Tout d'abord, il y a le cas de l'Original Asker. Il vient de passer une heure à poster à ce sujet et à lire les réponses. Combien de temps aurait-il fallu à l'auteur pour écrire tout?: Comme un si / alors tout au long de sa vie. Pas une heure pour être sûr.
Deuxièmement, dans les langages de type C, vous prenez l'habitude de simplement savoir que les conditions sont la première chose de la ligne. J'ai remarqué cela lorsque j'utilisais Ruby et suis tombé sur des lignes comme:
Si j'étais un utilisateur de Ruby depuis longtemps, je n'aurais probablement pas eu de problème avec cette ligne, mais venant de C, quand vous voyez "callMethodWwhat" comme la première chose dans la ligne, vous vous attendez à ce qu'elle soit exécutée. Le?: Est moins énigmatique, mais toujours assez inhabituel pour déranger un lecteur.
L'avantage, cependant, est une sensation vraiment cool dans votre ventre lorsque vous pouvez écrire une déclaration if de 3 lignes dans l'espace de 1 des lignes. Je ne peux pas le nier :) Mais honnêtement, pas nécessairement plus lisible par 90% des gens simplement à cause de sa «rareté».
Quand il s'agit vraiment d'une affectation basée sur un booléen et des valeurs, je n'ai pas de problème avec cela, mais il peut facilement être abusé.
la source
Les expressions conditionnelles sont dans un style complètement différent, sans if explicite dans l'instruction.
La syntaxe est: expression-booléenne? expression1: expression2;
Le résultat de cette expression conditionnelle est
expression1 si l'expression booléenne est vraie;
sinon, le résultat est expression2.
Supposons que vous souhaitiez affecter le plus grand nombre de variables num1 et num2 à max. Vous pouvez simplement écrire une instruction en utilisant l'expression conditionnelle: max = (num1> num2)? num1: num2;
Remarque: les symboles? et: apparaissent ensemble dans une expression conditionnelle. Ils forment un opérateur conditionnel et également appelé opérateur ternaire car il utilise trois opérandes. C'est le seul opérateur ternaire en Java.
cité de: Introduction à la programmation Java 10e édition par Y. Daniel Liang pages 126-127
la source