Comme vous l'écrivez :
map(Foo::makeSomething)
le compilateur s'attend à une de ces deux possibilités :
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 :