Im Folgenden tauchen wir weiter in das Java8 -Funktionsprogrammiermodell ein
public class test1 {public static void main (String [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,10); list.foreach (neuer Verbraucher <Integer> () {@Override public void Accept (Integer Integer) {System.out.println (Integer);}}); }}Dieses Programm ist einfach, initialisieren Sie zuerst eine Sammlung von Ganzzahltypen und geben Sie dann jedes Element in die Konsole aus. Unter ihnen bemerkten wir die Foreach -Methode, die die neu hinzugefügte Standardmethode in Java 8 ist.
öffentliche Schnittstelle iterable <t> {. . auslassen. Standard -void foreach (Verbraucher <? Super t> action) {Objects.requirenonnull (Aktion); für (t t: ths) {action.accept (t); }}}Es wird in der iterablen Schnittstelle deklariert und durch die Standardwort -Standardeinstellung geändert. Auf diese Weise kann jeder Subtyp dieser Schnittstelle die Implementierung der Foreach -Methode erben, sodass die List -Schnittstelle eine indirekte Teilinterzike von iterablen ist, sodass sie auch die Standardmethode erbt. Java8 nimmt diesen cleveren Weg zur Erweiterung der Funktionen der Schnittstelle über und ist mit der alten Version kompatibel.
Als nächstes analysieren wir die Implementierung von foreach. Zunächst erhalten wir eine Parameteraktion des Verbrauchertyps, führen ein leeres Urteilsvermögen durch und durchqueren dann alle aktuellen Elemente und übergeben sie an die Akzeptanzmethode der Aktion zur Verarbeitung. Also, was zum Teufel ist Verbraucher? Schauen Sie sich den Quellcode an
@FunctionalInterfacepublic Interface Consumer <T> { /*** führt diese Operation im angegebenen Argument durch. * * @param t Das Eingabeargument */ void Accept (t t); . .OMITT.} Eine Schnittstelle mit nur einer abstrakten Methode wird durch @FunctionAnInterface, eine typische funktionale Schnittstelle, modifiziert.
OK, jetzt wissen wir, dass der Parameter des von Foreach empfangenen Verbrauchertyps eine funktionale Schnittstelle ist. Die einzige Akzeptanz der abstrakten Methode in der Schnittstelle empfängt einen Parameter und gibt keinen Wert zurück. Aus dem vorherigen Artikel wissen wir, dass eine der Möglichkeiten zum Erstellen von Instanzen funktionaler Schnittstellentypen darin besteht, Lambda -Ausdrücke zu verwenden, damit Sie das Top -Programm verwandeln können.
public class test1 {public static void main (String [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,10); // Lambda -Ausdruck empfängt einen Parameter, ohne die Wertliste zurückzugeben. }} Das Lambda -Ausdruckselement -> System.out.println (Element) erhält einen Parameter ohne Rückgabe eines Wertes und erfüllt die Anforderungen an die Annahme der Akzeptanzmethode und wird kompiliert und bestanden.
Das heißt, wenn ein Lambda -Ausdruck verwendet wird, um eine funktionale Schnittstelleninstanz zu erstellen, müssen die Eintragsparameter und die Rückgabe dieses Lambda -Ausdrucks der Methodensignatur der einzigen abstrakten Methode in dieser funktionalen Schnittstelle entsprechen.
Als nächstes wird das Programm geändert
public class test1 {public static void main (String [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,10); // Methodenreferenzliste.foreach (System.out :: println); }} Ich habe zwei Kolons hinter Out gesehen, aber trotzdem war ich in einem Chaos. . . Dies ist die zweite Möglichkeit, eine funktionale Schnittstelleninstanz zu erstellen: Methodenreferenzmethode Referenzsyntax ist Objekt :: Methodenname
In ähnlicher Weise muss die Verwendung der Methodenreferenzmethode zum Erstellen funktionaler Schnittstelleninstanzen auch die Definition der Methodensignatur einhalten. Weitere Informationen finden Sie im Quellcode für Println -Methoden
public void println (objekt x) {string s = string.Valueof (x); synchronisiert (this) {print (s); newline (); }} Empfangen Sie einen Parameter und gibt den Wert nicht zurück und kompilieren Sie ihn durch.
Schauen wir uns schließlich die letzte Art des Erstellens einer funktionalen Schnittstelle an. Die dritte Methode: Konstruktionsreferenz konstruieren und weiterhin das Programm ändern.
public class test1 {public static void main (String [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,10); // Konstruktor -Methodenreferenzliste.foreach (test1 :: new); } Test1 (Integer i) {System.out.println (i); }} Die vom Konstruktor verwiesene Syntax ist: Klassenname :: New
Wir haben Test1 einen neuen Konstruktor hinzugefügt, der einen Parameter empfängt, keinen Wert zurückgibt und durch kompiliert. (Nur die Verwendung von Konstruktorzitationen zu zeigen)
Basierend auf dem vorherigen Artikel können wir drei Möglichkeiten zusammenfassen, funktionale Schnittstellentypen zu erstellen:
1. Ausdruck von Lambda
2. Methodenzitat
3. Referenz für Konstruktionsmethoden
HINWEIS: Unabhängig von der Methode muss die Methodensignatur mit der abstrakten Methode übereinstimmen.