2017-02-09 1 views
-4

Juste une question rapide au sujet des bonnes pratiques de programmation,Programmation java propre, est-ce une mauvaise idée d'utiliser lambdas pour générer des paramètres d'entrée de méthode?

Les performances mises à part, à quel point une bonne/mauvaise idée pourrait-elle être quelque chose de ce genre? Je simplifie à l'excès le problème pour faire passer mon message, mais est-ce que c'est quelque chose comme ça?

public void methodWithInputString(String data) { 
    // do something with data 
} 

public void methodThatCallsTheAbove() { 
    methodWithInputString(

     // lambda with no input and a string as output 
     (() -> { 

      if (this.conditionIsTrue) 
       return "Condition is true"; 
      else 
       return "Condition is false"; 

     }).apply(); 

    ); 
} 

L'alternative serait simplement:

public void methodThatCallsTheAbove() { 
    if (this.conditionIsTrue) 
     methodWithInputString("Condition is true"); 
    else 
     methodWithInputString("Condition is false"); 
} 

Je comprends que la seconde est l'approche évidente/correcte, mais dans une situation où l'utilisation du premier fait mon propre code est-il encore une chose absurde faire?

+0

Si vous vous trouvez en utilisant un lambda dans la même méthode, il est défini, vous pouvez écrire une méthode à la place. – Moira

+0

Bien sûr, * si * vous pensez que c'est plus propre dans certains cas. Mais l'exemple que vous avez donné est très mauvais. Tout d'abord, il ne peut pas compiler. Et, vous auriez pu utiliser '?:' – ZhongYu

+0

La lisibilité souffre. Un nom de méthode est virtuellement auto-commentant. Un lambda vide a besoin d'un commentaire réel, et ne fournit pas de facilité de croissance. – Compass

Répondre

0

+1 pour la remarque d'Andy Turner. Plus: Évite la référence des propriétés de l'objet à l'intérieur de ton lambda.

je suppose une version compilable de ce que vous essayez de montrer serait comme ceci:

public class Demo { 

    private static final Function<Boolean, String> GET_STRING_DEPENDING_ON_BOOLEAN = flagValue -> "Condition is ".concat(String.valueOf(flagValue)); 

    private boolean conditionIsTrue; 

    public void methodWithInputString(final String data) { 
     // do something with data 
    } 

    public void methodThatCallsTheAbove() { 
     methodWithInputString(GET_STRING_DEPENDING_ON_BOOLEAN.apply(this.conditionIsTrue)); 
    } 

} 

Le seul avantage de le faire (en utilisant un lambda au lieu d'une méthode) est d'être en mesure de re utilisation ce lambda et enchaîner quelque chose d'autre avec.

Exemple:

methodWithInputString(GET_STRING_DEPENDING_ON_BOOLEAN.andThen(data -> data.concat("somethingelse")).apply(this.conditionIsTrue));