75 votes

Intellij - peut être remplacé par une référence de méthode

Toujours quand j'utilise des expressions lambda comme ceci:

 .map(obj -> foo.makeSomething(obj))
 

IntelliJ suggère: "Peut être remplacé par une référence de méthode ...". Et quand j'essaye alors:

 .map(Foo::makeSomething)
 

J'obtiens la déclaration suivante: "Une méthode non statique ne peut pas être référencée à partir d'un contexte statique".

Pourquoi Idea me suggère-t-il d'utiliser une référence de méthode si elle n'est pas correcte?

98voto

davidh Points 107

Comme vous l'écrivez :

map(Foo::makeSomething)

le compilateur s'attend à une de ces deux possibilités :

  • l'invocation d'une Foo.makeSomething() méthode d'instance sur le premier paramètre de la lambda qui doit être défini en tant que Foo.

  • l'invocation d'une Foo.makeSomething() méthode statique.

La première possibilité est éliminé par le compilateur comme le premier paramètre de la lambda déclarée obj n'est pas un Foo.

Et d'après votre message d'erreur, Foo.makeSomething() est une méthode d'instance :

Non méthode statique ne peut pas être référencé à partir d'un contexte statique"

Ainsi, le deuxième possibilité (en invoquant un Foo.makeSomething() méthode statique) n'est pas légale, soit en tant que makeSomething() n'est pas statique.


En fait, ce que vous voulez, c'est l'application de l' makeSomething() méthode d'instance sur une variable qui ne fait pas partie de la lambda paramètres.
Vous pouvez le faire, mais vous devez utiliser une autre syntaxe.

Au lieu de spécifier Foo::, utilisez foo::.
De cette façon, la méthode d'instance makeSomething() sera appliquée sur l' foo variable :

map(foo::makeSomething)

IntelliJ Intention

Note de l'inspection que les rapports des lambdas qui peut être remplacée par la méthode des références peuvent également être automatiquement remaniée par l'IDE via une intention.
Pour ce faire, placez le curseur sur le lambda (n'importe où) et affichage contextuel des intentions (Alt+Enter par défaut). Vous devriez voir l'intention :

Remplacer lambda avec la méthode de référence

Quelques captures d'écran :

intention proposition

intention result

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X