web-dev-qa-db-fra.com

Opérateur ternaire - JAVA

Est-il possible de changer cela:

if(String!= null) {

    callFunction(parameters);

} else {

    // Intentionally left blank

}

... à un opérateur ternaire?

28
Lucas Pugliese

Eh bien, le ternary operator Dans Java agit comme ceci ...

return_value = (true-false condition) ? (if true expression) : (if false expression);

... Une autre façon de voir les choses ...

return_value = (true-false condition) 
             ? (if true expression) 
             : (if false expression);

Votre question est un peu vague et nous devons assumer ici.

  • Si (et seulement si)callFunction(...) déclare une valeur de retour non-void (Object, String, int, double, etc ..) - il semble que cela ne se fasse pas via votre code - alors vous pourriez le faire cette...

    return_value = (string != null) 
                 ? (callFunction(...)) 
                 : (null);
    
  • Si callFunction(...) ne renvoie pas de valeur, vous ne pouvez pas utilisez l'opérateur ternaire! Aussi simple que cela. Vous utiliserez quelque chose dont vous n’avez pas besoin.

    • S'il vous plaît poster plus de code pour éclaircir les problèmes

Néanmoins, l'opérateur ternary ne devrait représenter que des assignations alternatives !! Votre code ne semble pas le faire, vous ne devriez donc pas le faire.

C'est comme ça qu'ils devraient travailler ...

if (obj != null) {            // If-else statement

    retVal = obj.getValue();  // One alternative assignment for retVal

} else {

    retVal = "";              // Second alternative assignment for retVale

}

Cela peut être converti en ...

retVal = (obj != null)
       ? (obj.getValue())
       : ("");

Puisqu'il semble que vous pourriez peut-être essayer de simplement refactoriser ce code pour qu'il ne soit composé que d'une seule ligne, j'ai ajouté ce qui suit

De plus, si votre fausse clause est vraiment vide, vous pouvez le faire ...

if (string != null) {

    callFunction(...);

} // Take note that there is not false clause because it isn't needed

OR

if (string != null) callFunction(...);  // One-liner
52

Oui. Vous pouvez en conservant le même null dans le bloc else.

String result = str !=null ?  callFunction(parameters) : null;

Assurez-vous que callFunction(parameters) renvoie un String.

2
Suresh Atta

L'opérateur ternaire peut être utilisé pour combiner deux expressions mais une instruction vide n'est pas une expression.

Un appel de méthode peut être utilisé comme expression si la méthode renvoie une valeur (read: n’est pas déclarée void) et peut être utilisée avec une constante fictive null pour former un opérateur ternaire mais le résultat serait encore une expression qui n'est pas autorisée dans les endroits où une instruction est requise, autrement dit, elle ne peut pas remplacer un if déclaration.

En ajoutant une autre construction prenant une expression et en n'imposant aucun effet secondaire supplémentaire, vous pouvez construire un remplacement complet. Par exemple. en déclarant et en affectant une nouvelle variable locale, sinon non utilisée, vous obtenez:

Object dummy=condition? callFunction(parameters): null;

Mais il n'y a aucun avantage à simplement dire if(condition) callFunction(parameters);. Cela pourrait même ajouter une surcharge inutile, car cela entraînerait la boxe automatique si la valeur de retour est un type primitif.

Avec Java 8, il existe une solution au puzzle qui fonctionne même pour les méthodes void:

((Runnable)(condition? ()->callFunction(parameters): ()->{})).run();

mais il n’a toujours aucun avantage à utiliser simplement if.

2
Holger

Cela pourrait être possible si votre méthode callFunction() a un type de retour. Ensuite, vous pourriez le faire comme SURESH ATTA écrit dans sa réponse:

String result = str!=null ? callFunction(str) : null;

Ou avec tout autre type de résultat ou tout autre argument. Si vous souhaitez également appeler une méthode dans l'instruction else, celle-ci doit avoir le même type de retour que celui de votre instruction if.

Si votre méthode n'a pas de type de retour/le type de retour de callFunction() est void, il n'est pas possible de changer votre if-else déclaration dans un opérateur ternaire.

1
msrd0