Unterstützt Java 8 Funktionen als Objekte der ersten Klasse?

8

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:

  • um die Funktion als Argument an eine andere Funktion zu übergeben?
  • um die Funktion als Rückgabewert einer anderen Funktion zurückzugeben?
  • und was ist mit Verschlüssen? Sind sie vollständig wie in funktionalen Sprachen implementiert oder haben sie einige Einschränkungen? Es scheint mir, dass es einige Einschränkungen gibt (Sie können den Wert der Variable, auf die Sie in einem Abschluss verweisen, nicht ändern, sie muss als final usw. markiert sein).
SPIRiT_1984 20.03.2014, 10:40
quelle

4 Antworten

8

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.

    
Marko Topolnik 20.03.2014 10:47
quelle
4

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.

    
Sean Reilly 20.03.2014 10:47
quelle
2

Methoden sind in Java keine erstklassigen Objekte, abgesehen von der bereits vorhandenen Verwendung in der Reflexion, um Ihre Fragen zu beantworten:

  1. Ja, Sie können es weitergeben, aber es muss die Signatur erfüllen.

    • Für 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() .
    • aus
    • Allerdings müssen Sie für double method() ein DoubleSupplier wie folgt verwenden: DoubleSupplier method = this::method und dann als double d = method.get() verwenden.
    • Und viele weitere Signaturen, und Sie können sogar Ihre eigenen mit funktionalen Schnittstellen definieren.
  2. Ja, es ist möglich, aber nur bestimmte Signaturen wie in Punkt 1 gezeigt.

  3. 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.

skiwi 20.03.2014 10:46
quelle
1

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.

    
NimChimpsky 20.03.2014 10:46
quelle

Tags und Links