Ich habe heute über die Java-8-Version gelesen. Aber ich verstehe das Konzept der Referenzmethoden in Java 8 nicht vollständig. Bedeutet das, dass Java jetzt die Unterstützung von Funktionen als erstklassige Objekte hat? Ich habe gesehen, wie man einen Bezug zur Funktion konstruiert. Aber mir scheint, dass das Converter-Objekt, das sie zur Verfügung stellen, ziemlich begrenzte Funktionalität hat. Ist es jetzt in Java möglich:
Die wichtigsten Aspekte erstklassiger Funktionen wurden in das bestehende Java-System integriert. Es wurde kein echter Funktionstyp eingeführt; Jede Schnittstelle mit einer einzigen Methode ist ein eigener "Funktionstyp". Wie bei den ersten beiden Fragen können Sie Instanzen solcher funktionalen Schnittstellen frei herumreichen.
Es gibt viele subtile Änderungen an der Semantik, die es erlauben, Lambda-Syntax / Methodenreferenzen zu verwenden, um eine solche Schnittstelle zu implementieren. Sie können sogar Funktionen höherer Ordnung wie compose
verwenden, die den generischen Typ Function
zurückgeben und an eine Methode übergeben, die einen kompatiblen funktionalen Schnittstellentyp erwartet.
Sie können den Wert der Variablen, auf die Sie in einem Abschluss verweisen, nicht ändern
Dies ist keine Einschränkung für Java. Tatsächlich unterstützen die meisten FP-Sprachen keine veränderlichen Variablen. Beachten Sie, dass das Schlüsselwort final
nicht für die Variable verwendet werden muss. Das Konzept von effektiv final kümmert sich darum.
Es ist möglich. Wie machst du es?
Konstruieren Sie zuerst eine "funktionale Schnittstelle" (oder verwenden Sie eine der bereitgestellten). Eine funktionale Schnittstelle ist eine Schnittstelle mit einer einzigen Methode. java.lang.Runnable ist ein Beispiel.
Zweitens schreiben Sie eine Methode, die eine funktionale Schnittstelle als Parameter verwendet.
%Vor%Drittens schreiben Sie eine Methode mit der richtigen Signatur.
%Vor%Viertens rufen Sie die Funktion auf, die eine Methodenreferenz übergibt.
%Vor% Sie werden feststellen, dass keine der Klassen, die Sie jemals geschrieben haben, Runnable
explizit implementiert. Dies wird vom Compiler für Sie erledigt.
Sie können etwas ähnliches mit einem lamdba-Ausdruck tun:
%Vor% Um die Funktion als Wert einer anderen Funktion zurückzugeben, geben Sie einfach eine Instanz von Runnable
zurück.
Methoden sind in Java keine erstklassigen Objekte, abgesehen von der bereits vorhandenen Verwendung in der Reflexion, um Ihre Fragen zu beantworten:
Ja, Sie können es weitergeben, aber es muss die Signatur erfüllen.
void method()
verwenden Sie Runnable
, wie folgt: Runnable method = this::method
, wenn es sich in derselben Klasse befindet, und führen Sie dann die tatsächliche Methode mit method.run()
. double method()
ein DoubleSupplier
wie folgt verwenden:
DoubleSupplier method = this::method
und dann als double d = method.get()
verwenden. Ja, es ist möglich, aber nur bestimmte Signaturen wie in Punkt 1 gezeigt.
Lambdas verhalten sich genau wie anonyme innere Klassen, die selbst Closures sind. Java hat seit der Einführung anonymer innerer Klassen Unterstützung für Closures. Die einzige Sache, die jetzt hinzugefügt wird, ist, dass die Syntax viel hübscher ist.
Nein, keine erstklassigen Funktionen. Lambda-Ausdruck wird in ein Interface eingepackt, und etwas synthetischer Zucker, der für die Kürze angewendet wird .
Aber Sie können, t eine Funktion für sich selbst erstellen und sie um verschiedene Methoden herumreichen, ob dies ein wichtiger Punkt ist oder nicht, ist eine andere Frage.
Tags und Links java functional-programming