Während Sie schreiben:
map(Foo::makeSomething)
Der Compiler erwartet eine dieser beiden Möglichkeiten:
Aufrufen einer Foo.makeSomething()Instanzmethode für den ersten Parameter des Lambda, der als definiert werden muss Foo.
Aufrufen einer Foo.makeSomething()statischen Methode.
Die erste Möglichkeit wird vom Compiler ausgeschlossen, da der erste Parameter des deklarierten Lambda objnicht a ist Foo.
Und laut Ihrer Fehlermeldung Foo.makeSomething()ist eine Instanzmethode:
Nicht statische Methoden können nicht aus einem statischen Kontext referenziert werden. "
Die zweite Möglichkeit (Aufrufen einer Foo.makeSomething()statischen Methode) ist also ebenfalls nicht zulässig, da sie makeSomething()nicht statisch ist.
Sie möchten die makeSomething()Instanzmethode auf eine Variable anwenden , die nicht Teil der Lambda-Parameter ist.
Sie können dies tun, müssen jedoch eine andere Syntax verwenden.
Anstatt anzugeben Foo::, verwenden Sie foo::.
Auf diese Weise wird die Instanzmethode makeSomething()auf die fooVariable angewendet :
map(foo::makeSomething)
IntelliJ Intention
Beachten Sie, dass Inspektionen, die Lambdas melden, die durch Methodenreferenzen ersetzt werden können, von der IDE auch automatisch über eine Absicht überarbeitet werden können.
Setzen Sie dazu den Cursor auf das Lambda (irgendwo darauf) und zeigen Sie kontextbezogene Absichten an ( Alt+Enterstandardmäßig). Sie sollten die Absicht sehen:
Ersetzen Sie Lambda durch Methodenreferenz
Einige Screenshots:


foo::makeSomething, was funktionieren würde.