web-dev-qa-db-fra.com

Comment appelle-t-on l'opérateur Java?: Et qu'il fait?

J'ai travaillé avec Java 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 puis-je le lire? Je suis à peu près sûr de savoir comment cela fonctionne.

  • si isHere est vrai, getHereCount() est appelée,
  • si isHere est faux getAwayCount() est appelée.

Correct? Comment s'appelle cette construction?

142
mainstringargs

Oui, c’est une forme abrégée de

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

C'est ce qu'on appelle l'opérateur conditionnel . Beaucoup de gens l'appellent (à tort) l'opérateur ternaire, car il s'agit du seul opérateur ternaire (à trois arguments) en Java, C, C++ et probablement de nombreux autres langages. Mais théoriquement, il y aurait un autre opérateur ternaire pourrait, alors qu'il ne peut en exister qu'un opérateur conditionnel.

Le nom officiel est donné dans le spécification de langage Java :

§15.25 Opérateur conditionnel? :

L'opérateur conditionnel ? : Utilise la valeur booléenne d'une expression pour décider laquelle des deux autres expressions doit être évaluée.

Notez que les deux branches doivent conduire à des méthodes avec des valeurs de retour:

Il s’agit d’une erreur de compilation lorsqu’une expression de la deuxième ou de la troisième opérande est une invocation d’une méthode void.

En fait, selon la grammaire des expressions d'expression ( §14.8 ), il n'est pas permis à une expression conditionnelle d'apparaître dans un contexte où l'invocation d'une méthode vide pourrait apparaître.

Donc, si doSomething() et doSomethingElse() sont des méthodes vides, vous ne pouvez pas compresser ceci:

if (someBool)
    doSomething();
else
    doSomethingElse();

dans ceci:

someBool ? doSomething() : doSomethingElse();

Mots simples:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
178
Michael Myers

D'autres ont répondu à cette question dans une mesure raisonnable, mais souvent sous le nom "d'opérateur ternaire".

En tant que 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 que c'est le seul opérateur ternaire dans Java en ce 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 ainsi, car cela indique dans une certaine mesure le comportement de l'opérateur (évaluation d'une condition) plutôt que le nombre d'opérandes dont il dispose.

30
Jon Skeet

Selon le Sun Java Spécification , il est appelé l'opérateur conditionnel. Voir la section 15.25. Vous avez raison de dire 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 se 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)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

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.

17
JRL

Pas tout à fait correct, pour être précis:

  1. si isHere est vrai, le résultat de getHereCount () est retourné
  2. otheriwse le résultat de getAwayCount () est renvoyé

Ce "rendu" est très important. Cela signifie que les méthodes doivent renvoient une valeur et que la valeur doivent doit être assignée quelque part.

En outre, c'est pas exactement syntaxiquement équivalent à la version if-else. Par exemple:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

Si codé avec if-else, le nombre de bytecodes sera toujours plus important.

5
RichN
int count = isHere ? getHereCount(index) : getAwayCount(index);

veux dire :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
4
Romain Linsolas

Ternaire, conditionnel; tomate, tomate. Ce qui est vraiment précieux, c'est l'initialisation variable. Si (comme moi) vous aimez initialiser les variables où elles sont définies, l'opérateur ternaire conditionnel (car ce sont les deux) vous permet de le faire dans les cas où sa valeur est conditionnelle. Particulièrement notable dans les champs finaux, mais utile ailleurs.

par exemple.:

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

Sans cet opérateur - quel que soit son nom - vous devez 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é avec if/else, au moins en Java. Mais je trouve ce nettoyeur.

3
Carl Manaster

Cette construction s'appelle opérateur ternaire en informatique et en techniques de programmation.
Et Wikipedia suggère l'explication suivante:

En informatique, un opérateur ternaire (parfois appelé à tort opérateur tertiaire) est un opérateur qui prend trois arguments. Les arguments et les résultats peuvent être de différents types. De nombreux langages de programmation utilisant une syntaxe de type C comportent un opérateur ternaire,?:, Qui définit une expression conditionnelle.

Non seulement en Java, cette syntaxe est disponible dans PHP, mais aussi dans Objective-C.

Dans ce qui suit link cela donne l'explication suivante, qu'il est bon de comprendre:

Un opérateur ternaire est une opération opérant sur 3 entrées. Il s'agit d'un raccourci pour une instruction if-else et est également appelé opérateur conditionnel.

En Perl/PHP cela fonctionne comme:
boolean_condition ? true_value : false_value

En C/C++, cela fonctionne comme:
logical expression ? action for true : action for false

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 voulue de la logique conditionnelle.

Nous pouvons simplifier les blocs If-Else avec cet opérateur ternaire pour une ligne d'instruction de code.
Par exemple:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

Peut être égal à ce qui suit:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

Donc, si nous nous référons à votre déclaration:

int count = isHere ? getHereCount(index) : getAwayCount(index);

C'est en réalité l'équivalent à 100% du bloc If If-Else suivant:

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

C'est ça!
J'espère que cela a été utile à quelqu'un!
À votre santé!

3
Randika Vishman
condition ? truth : false;

Si la condition est true, renvoyez le premier paramètre. Si la condition est false, renvoyez le deuxième paramètre.

C'est ce qu'on appelle opérateur conditionnel et il s'agit d'un type de opération ternaire .

3
Joe Phillips

Correct. C'est appelé le opérateur ternaire . Certains l'appellent aussi le opérateur conditionnel .

2
cletus

Son opérateur ternaire (? :)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.
2
Darsy

En réalité, 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:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

ce qui est mieux que d'utiliser si, sinon si, sinon.

1
Praised

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:

String s = mayBeNull?.toString() ?: "null";

Ce serait particulièrement pratique lorsque le déballage automatique a lieu.

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

Il a été sélectionné pour un examen plus approfondi sous "Project Coin" du JDK 7.

1
erickson

J'aime vraiment cet opérateur, mais le lecteur doit être pris en compte.

Vous devez toujours trouver un équilibre entre la compacité du code et le temps passé à le lire, ce qui présente des défauts assez graves.

Tout d'abord, il y a le cas du demandeur d'origine. Il vient de passer une heure à écrire à ce sujet et à lire les réponses. Combien de temps aurait-il fallu à l'auteur pour écrire chaque?: Comme un/si 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 conditionnels sont la première chose à faire. J'ai remarqué cela quand j'utilisais Ruby et que je rencontrais des lignes comme:

callMethodWhatever(Long + Expression + with + syntax) if conditional

Si j’avais été longtemps Ruby utilisateur, je n’aurais probablement pas eu de problème avec cette ligne, mais venant de C, lorsque vous voyez "callMethodWwhat" comme première chose dans la ligne, vous Le?: est moins crypté, mais reste assez inhabituel pour jeter un lecteur.

L'avantage, cependant, est une sensation vraiment cool dans votre ventre lorsque vous pouvez écrire une déclaration if à 3 lignes en l'espace d'une des lignes. Je ne peux pas le nier :) Mais honnêtement, ce n’est pas nécessairement plus lisible par 90% des gens, simplement à cause de sa rareté.

Quand il s’agit vraiment d’une mission basée sur un booléen et des valeurs, cela ne me pose pas de problème, mais on peut facilement en abuser.

0
Bill K

Les expressions conditionnelles sont dans un style complètement différent, sans explicite si dans l'instruction.

La syntaxe est la suivante: 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 nombre maximal de variables num1 et num2 à max. Vous pouvez simplement écrire une déclaration 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.

extrait de: Intro to Java Programmation de la 10ème édition par Y. Daniel Liang page 126 - 127

0
Ged

Oui vous avez raison. ?: est généralement appelé "opérateur conditionnel ternaire", souvent appelé simplement "opérateur ternaire". C'est une version abrégée du standard if/else conditionnel.

opérateur conditionnel ternaire

0
Gary

Il s’agit de l’opérateur conditionnel, et c’est plus qu’une manière concise d’écrire des déclarations.

Puisqu'il s'agit d'une expression qui renvoie une valeur, elle peut être utilisée dans le cadre d'autres expressions.

0
justinhj