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 obj
nicht 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 foo
Variable 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+Enter
standardmäßig). Sie sollten die Absicht sehen:
Ersetzen Sie Lambda durch Methodenreferenz
Einige Screenshots:
foo::makeSomething
, was funktionieren würde.