In Java 8 können Methoden als Lambda-Ausdrücke erstellt und als Referenz übergeben werden (mit ein wenig Arbeit unter der Haube). Es gibt viele Beispiele online, bei denen Lambdas erstellt und mit Methoden verwendet werden, aber keine Beispiele dafür, wie eine Methode erstellt wird, bei der ein Lambda als Parameter verwendet wird. Wie lautet die Syntax dafür?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Antworten:
Lambdas sind lediglich ein Call-Site-Konstrukt: Der Empfänger des Lambda muss nicht wissen, dass ein Lambda beteiligt ist, sondern akzeptiert eine Schnittstelle mit der entsprechenden Methode.
Mit anderen Worten, Sie definieren oder verwenden eine funktionale Schnittstelle (dh eine Schnittstelle mit einer einzelnen Methode), die genau das akzeptiert und zurückgibt, was Sie möchten.
Zu diesem Zweck wird Java 8 mit einer Reihe häufig verwendeter Schnittstellentypen geliefert
java.util.function
(danke an Maurice Naftalin für den Hinweis zum JavaDoc).Für diesen speziellen Anwendungsfall gibt es
java.util.function.IntBinaryOperator
mit einer einzigenint applyAsInt(int left, int right)
Methode , so dass Sie Ihre schreiben könntenmethod
wie folgt aus :Sie können aber auch Ihre eigene Oberfläche definieren und wie folgt verwenden:
Die Verwendung Ihrer eigenen Schnittstelle hat den Vorteil, dass Sie Namen haben können, die die Absicht deutlicher anzeigen.
quelle
(int a, int b, int c)
fürTwoArgIntOperator
. Was passiert , wennTwoArgIntOperator
hat zwei Methoden mit derselben Signatur. Diese Antwort ist verwirrend.Um den Lambda-Ausdruck zu verwenden, müssen Sie entweder Ihre eigene Funktionsschnittstelle erstellen oder die Java-Funktionsschnittstelle für Operationen verwenden, für die zwei Ganzzahlen erforderlich sind und die als Wert zurückgegeben werden. IntBinaryOperator
Benutzerdefinierte Funktionsschnittstelle verwenden
Verwenden der Java-Funktionsschnittstelle
Ein anderes Beispiel, das ich erstellt habe, ist hier
quelle
IntBinaryOperator
Dokumentation ist tot.Für Funktionen, die nicht mehr als 2 Parameter haben, können Sie diese übergeben, ohne eine eigene Schnittstelle zu definieren. Zum Beispiel,
In
BiFunction<Integer, String, List<String>>
,Integer
undString
sind die Parameter, undList<String>
ist deren Rückgabetyp.Für eine Funktion mit nur einem Parameter, können Sie verwenden
Function<T, R>
, woT
ist seine Parameter - Typ undR
ist der Rückgabewert Typ. Auf dieser Seite finden Sie alle Schnittstellen, die Java bereits zur Verfügung stellt.quelle
Es gibt eine öffentliche, über das Internet zugängliche Version der Lambda-fähigen Java 8 JavaDocs, die über http://lambdafaq.org/lambda-resources verlinkt ist . (Dies sollte natürlich ein Kommentar zu Joachim Sauers Antwort sein, aber ich kann nicht mit den Reputationspunkten, die ich zum Hinzufügen eines Kommentars benötige, in mein SO-Konto gelangen.) Die Lambdafaq-Site (ich pflege sie) beantwortet diese und viele andere Java-Antworten -lambda Fragen.
NB Diese Antwort wurde geschrieben, bevor die Java 8 GA-Dokumentation öffentlich verfügbar wurde . Ich habe es jedoch beibehalten, da die Lambda-FAQ für Benutzer, die sich mit den in Java 8 eingeführten Funktionen vertraut machen, möglicherweise immer noch nützlich sind.
quelle
Für mich ist die Lösung, die am sinnvollsten ist, eine
Callback
Schnittstelle zu definieren :und um es dann als Parameter in der Funktion zu verwenden, die Sie aufrufen möchten:
Nur eine Präzision
Ein Lambda ist keine spezielle Schnittstelle, Klasse oder irgendetwas anderes, das Sie selbst deklarieren könnten.
Lambda
ist nur der Name der() -> {}
speziellen Syntax, die eine bessere Lesbarkeit ermöglicht, wenn Schnittstellen mit einer Methode als Parameter übergeben werden. Es wurde entwickelt, um dies zu ersetzen:Im obigen Beispiel
Callback
handelt es sich also nicht um ein Lambda, sondern nur um eine reguläre Schnittstelle.lambda
ist der Name der Verknüpfungssyntax, mit der Sie sie implementieren können.quelle
Für jeden, der dies googelt, wäre eine gute Methode zu verwenden
java.util.function.BiConsumer
. Ex:Der Aufdruck wäre: 166
quelle
Consumer<Pair<A,B>>
Verwenden Sie stattdessenBiConsumer<A,B>
für diesen Fall. ( docs )Der Lambda-Ausdruck kann als Argument übergeben werden. Um einen Lambda-Ausdruck als Argument zu übergeben, muss der Typ des Parameters (der den Lambda-Ausdruck als Argument empfängt) vom Typ der funktionalen Schnittstelle sein.
Wenn es eine funktionale Schnittstelle gibt -
Und es gibt eine Filtermethode, die das int nur dann in die Liste einfügt, wenn es größer als 5 ist. Beachten Sie hier, dass die Filtermethode die Funktionsschnittstelle IMyFunc als einen der Parameter hat. In diesem Fall kann der Lambda-Ausdruck als Argument für den Methodenparameter übergeben werden.
quelle
Sie können Funktionsschnittstellen wie oben erwähnt verwenden. Nachfolgend einige Beispiele
Ich hoffe es hilft
quelle
Das ist einfach. Der Zweck des Lambda-Ausdrucks besteht darin, eine funktionale Schnittstelle zu implementieren. Es ist die Schnittstelle mit nur einer Methode. Hier ist ein großartiger Artikel über vordefinierte und ältere funktionale Schnittstellen.
Wie auch immer, wenn Sie Ihre eigene funktionale Schnittstelle implementieren möchten, machen Sie es. Nur zum einfachen Beispiel:
Erstellen wir also eine Klasse, in der wir eine Methode erstellen, die den Typ von MyFunctionalInterface akzeptiert :
Als letztes sollten Sie die Implementierung von MyFunctionalInterface an die von uns definierte Methode übergeben:
Das ist es!
quelle
Lambda ist kein Objekt, sondern eine funktionale Schnittstelle. Man kann so viele funktionale Schnittstellen wie möglich definieren, indem man das @FuntionalInterface als Anmerkung verwendet
Die Ausgabe wird wie folgt sein
Das Grundkonzept eines Lambda-Ausdrucks besteht darin, Ihre eigene Logik, aber bereits definierte Argumente zu definieren. Im obigen Code können Sie die Definition der do-Funktion von einer zusätzlichen zu einer anderen Definition ändern, Ihre Argumente sind jedoch auf 2 beschränkt.
quelle
Um einen Lamda-Ausdruck als Parameter zu übergeben, benötigen wir einen Typ, in dem wir ihn halten können. Genau wie ein ganzzahliger Wert halten wir in der primitiven int- oder Integer-Klasse. Java hat keinen separaten Typ für den Lamda-Ausdruck, sondern verwendet eine Schnittstelle als Typ für das Argument. Diese Schnittstelle sollte jedoch eine funktionale Schnittstelle sein .
quelle
Mach Folgendes ..
Sie haben deklariert.
method(lambda l)
Sie möchten lediglich eine Schnittstelle mit dem Namen erstellenlambda
und eine abstrakte Methode deklarierenMethodenname spielt hier keine Rolle ..
Also , wenn u nennen
MyClass.method( (a,b)->a+b)
Diese Implementierung(a,b)->a+b
wird an Ihre Schnittstelle Add - Methode injiziert werden .So , wenn Sie nennenl.add
es diese Umsetzung dauern wird, und die Addition vona
undb
undreturn l.add(2,3)
kehrt5
. - Grundsätzlich ist es das, was Lambda tut.quelle
Hier erfahren Sie ungefähr, wie C # dieses Problem behandelt (jedoch als Java-Code ausgedrückt). So etwas könnte fast alle Ihre Bedürfnisse erfüllen:
quelle
Die Verwendung von Lambda als Parameter ist flexibel. Es ermöglicht die funktionale Programmierung in Java. Die grundlegende Syntax lautet
Im Folgenden finden Sie eine Möglichkeit, eine Methode zu definieren, bei der die Funktionsschnittstelle (Lambda wird verwendet) als Parameter verwendet wird. ein. Wenn Sie beispielsweise eine in einer Funktionsschnittstelle deklarierte Methode definieren möchten, wird die Funktionsschnittstelle als Argument / Parameter für eine von aufgerufene Methode angegeben
main()
Oben erklärt eine bestimmte Verwendung des Lambda-Ausdrucks, es gibt mehr. ref Java 8 Lambda innerhalb eines Lambda kann keine Variable vom äußeren Lambda ändern
quelle