Immer wenn ich Lambda-Ausdrücke wie diesen verwende:
.map(obj -> foo.makeSomething(obj))
IntelliJ schlägt vor: "Kann durch Methodenreferenz ersetzt werden ...". Und wenn ich es dann versuche:
.map(Foo::makeSomething)
Ich erhalte die folgende Anweisung: "Nicht statische Methode kann nicht aus einem statischen Kontext referenziert werden".
Warum schlägt Idea vor, dass ich eine Methodenreferenz verwenden sollte, wenn diese nicht korrekt ist?
java
intellij-idea
Nutzer
quelle
quelle
foo::makeSomething
, was funktionieren würde.foo::makeSomething
. Sie möchten die Methode für das Objekt foo aufrufen, nicht für die Klasse Foo. Sie können IntelliJ auch einfach den Code für Sie transformieren lassen (Alt-Enter).Antworten:
Während Sie schreiben:
Der Compiler erwartet eine dieser beiden Möglichkeiten:
Aufrufen einer
Foo.makeSomething()
Instanzmethode für den ersten Parameter des Lambda, der als definiert werden mussFoo
.Aufrufen einer
Foo.makeSomething()
statischen Methode.Die erste Möglichkeit wird vom Compiler ausgeschlossen, da der erste Parameter des deklarierten Lambda
obj
nicht a istFoo
.Und laut Ihrer Fehlermeldung
Foo.makeSomething()
ist eine Instanzmethode:Die zweite Möglichkeit (Aufrufen einer
Foo.makeSomething()
statischen Methode) ist also ebenfalls nicht zulässig, da siemakeSomething()
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 Siefoo::
.Auf diese Weise wird die Instanzmethode
makeSomething()
auf diefoo
Variable angewendet :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:Einige Screenshots:
quelle