Sonar : Remplacez cette lambda avec une méthode de référence
Cet exemple de code
Collection<Number> values = transform(
getValuatedObjects(),
input -> getValueProvider().apply(input).getValue());
viole les sonarqube règle:
Remplacer les lambdas avec la méthode des références si possible
est-il un sonar bug ?
ou puis-je vraiment utiliser une méthode de référence ?
Il sera plus facile si vous posterai plus de code...
OriginalL'auteur gontard | 2014-09-01
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas remplacer le lambda
input -> getValueProvider().apply(input).getValue()
avec une méthode de référence sans changer la sémantique.Une méthode de référence remplacer un unique l'invocation de méthode, de sorte qu'il ne peut pas simplement remplacer une expression lambda constitué de plus d'une invocation de méthode.
Une lambda expression de la forme
input -> getValueProvider().apply(input)
pourrait être remplacé pargetValueProvider()::apply
si, et seulement si, le temps d'évaluation degetValueProvider()
n'a pas d'importance que dans le lambda forme de la méthode est appelée à chaque corps de lambda, de l'évaluation, tandis que pour la méthode de référence, il est invoqué qu'une seule fois et le résultat capturé.Ceci est similaire à la différence entre
x -> System.out.println(x)
etSystem.out::println
où la lecture du contenu du champSystem.out
arrive à des moments différents, mais en général il n'a pas d'importance. Mais vous devez être conscient de la différence.Dans votre exemple, une troisième méthode
getValue()
est invoquée. La seule façon d'exprimer que, avec la méthode des références a besoin d'une interface fonctionnelle commeFunction
qui a des méthodes commeandThen
et/oucompose
. Cependant, la façon dont Java 8 œuvres, qui aurait besoin de jeter la première méthode de référence pour l'interface cible d'invoquer la combinaison de la méthode qui serait en aucune façon, plus facile à lire que l'expression lambda, vous avez maintenant:((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
oùY
est le type,apply(input)
retourne.Noter que la règle dit “Remplacer lambdas avec la méthode des références lorsque cela est possible”, qui vous donne de la salle-à-dire, “eh bien, ici, c'est impossible”, cependant, je ne suis pas sûr de savoir comment beaucoup vous pouvez appeler cela une “règle”, puis...
Salut, je ne confirme c'est bien un faux positif. Billet ont été créés pour corriger ce problème: jira.codehaus.org/browse/SONARJAVA-640
mise à jour de vieille lien à la question : jira.sonarsource.com/browse/SONARJAVA-640
OriginalL'auteur Holger