it-swarm.com.de

Intellij - kann durch Methodenreferenz ersetzt werden

Immer, wenn ich Lambda-Ausdrücke wie diese 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: "Auf eine nicht statische Methode kann in einem statischen Kontext nicht verwiesen werden".

Warum schlägt Idea mir vor, eine Methodenreferenz zu verwenden, wenn diese nicht korrekt ist?

55
user

Wie du schreibst:

map(Foo::makeSomething)

der Compiler erwartet eine dieser beiden Möglichkeiten:

  • aufrufen einer Instanzmethode Foo.makeSomething() für den ersten Parameter des Lambda, der als Foo definiert werden muss.

  • aufrufen einer statischen Foo.makeSomething() -Methode.

Die erste Möglichkeit wird vom Compiler ausgeschlossen, da der erste Parameter des als obj deklarierten Lambdas kein Foo ist.

Und entsprechend Ihrer Fehlermeldung ist Foo.makeSomething() eine Instanzmethode:

Nicht statische Methode kann nicht aus einem statischen Kontext referenziert werden "

Daher ist die zweite Möglichkeit (Aufrufen einer statischen Foo.makeSomething() -Methode) auch nicht zulässig, da makeSomething() nicht statisch ist.


Sie möchten die Instanzmethode makeSomething() auf eine Variable anwenden, die nicht Teil der Lambda-Parameter ist.
Sie können dies tun, müssen jedoch eine andere Syntax verwenden.

Anstatt Foo:: Anzugeben, verwenden Sie foo::.
Auf diese Weise wird die Instanzmethode makeSomething() auf die Variable foo angewendet:

map(foo::makeSomething)

IntelliJ Intention

Beachten Sie, dass eine Inspektion, die Lambdas meldet, die durch Methodenreferenzen ersetzt werden können, auch automatisch von IDE über eine Absicht umgestaltet werden kann.
Setzen Sie dazu den Cursor auf das Lambda (irgendwo darauf) und zeigen Sie kontextbezogene Absichten an (standardmäßig Alt+Enter). Sie sollten die Absicht sehen:

Lambda durch Methodenreferenz ersetzen

Einige Screenshots:

intention proposition

intention result

72
davidxxx