Ein Mechanismus zum Zuweisen des Codes, den Sie ausführen möchten, zu einer Schnittstellestypvariablen, für die nur eine Methode implementiert werden muss.
Eine funktionale Schnittstelle ist eine Schnittstelle mit nur einer Methode, die implementiert werden muss. Es wird als "Funktionstyp" bezeichnet, da für jeden Eingang ein Ausgang bestimmt wird.
Oberflächentyp | Methoden, die implementiert werden müssen | Charakteristisch |
---|---|---|
Consumer<T> | void accept(T) | Empfängt und verarbeitet Argumente. Argumente, die keine Ergebnisse zurückgebenVerbraucher |
Supplier<T> | T get() | Geben Sie nur das Ergebnis zurück, ohne etwas zu erhaltenLieferant |
Predicate<T> | boolean test(T) | Nehmen Sie ein Argument und bewerten Sie esDurchsetzungsvermögen |
Function<T, R> | R apply(T) | Erhält ein Argument und den angegebenen Typ(R)Gibt das Ergebnis von zurückProzessor |
Beispiel für eine funktionale Schnittstelle Referenz) Klasse für Java8-Lambda-Ausdruck ** - Die forEach-Methode der Schnittstelle java.util.List kann Lambda-Ausdruck vom Typ Consumer empfangen. ** Referenz) Liste der offiziellen Dokumentschnittstellen
Beispiel)
public static void main(String[] args){
List<Integer> list = List.of(1,2,3);
list.forEach((x) ->{System.out.println(x)}); //Empfängt und verarbeitet Argumente und gibt keine Werte zurück
}
** · Die toUpperCase-Methode ** der Klasse java.lang.String kann einen Lambda-Ausdruck vom Funktionstyp empfangen
Referenz Offizielles Dokument toUpperCase ()
Beispiel)
public static void main(String[] args){
Function<String, String> func = (x) -> {return x.toUpperCase();}; //Nimmt ein Argument und gibt das Ergebnis des angegebenen Typs zurück
System.out.println(func.apply("hello world"));
}
Basic
Funktionstyp Schnittstellentyp Variablenname = (Argument) -> {// Verarbeitung ** return **};
Function<String, String> func = (x) -> { return x.toUpperCase(); };
<Wenn es ein Argument gibt, wird () weggelassen>
Funktionstyp Schnittstellentyp Variablenname = Argument-> {// Verarbeitung ** return **};
Function<String, String> func = x -> { return x.toUpperCase(); };
<Wenn es nur einen Prozess gibt, wird {} weggelassen>
Funktionstyp Schnittstellentyp Variablenname = Argumente-> // Verarbeitung; ** * Ich kann keine Rückgabeerklärung schreiben! !! ** ** **
list.forEach( x -> System.out.println(x) );
** [Das formale Argument des Lambda-Ausdrucks ist eine Konstante oder eine im Wesentlichen Konstante] **
-Beispiel eines Kompilierungsfehlers (von Java Silver Kuromoto)
void sample(){
int i = 0;
Supplier<Integer> foo = () -> i;
i++; //Ich muss im Wesentlichen konstant sein
System.out.println(foo.get());
}
** [Notieren Sie den Datentyp des Arguments] ** Deklarationen von Lambda-Ausdrucksvariablen können ** die Angabe von Datentypen auslassen **. Weil Sie den Typ des Arguments aus dem Typ der Funktionsschnittstelle ableiten können, die Sie zuweisen möchten.
Selbst wenn Sie eine Lambda-Ausdrucksvariable mit weggelassenem Argument und weggelassenem Typ schreiben, handelt es sich um eine neu definierte Variable. → ** Prüfen Sie, ob es sich mit einer vorhandenen Variablen im Bereich des Lambda-Ausdrucks überschneidet! !! ** ** **
-Beispiel für einen Kompilierungsfehler
final String val = "Hello World";
Consumer<String> func = (val) -> System.out.println(val); //Doppelter Name, verursacht durch val des Lambda-Ausdrucks und val der lokalen Variablen, Kompilierungsfehler
** [Umfang beachten] ** Der Lambda-Ausdruck ** scope ** deckt den gesamten Block ab, in den der Lambda-Ausdruck geschrieben ist
-Beispiel für einen Kompilierungsfehler
public class Main{
public static void main(String[] args){
Srting val = "A"; //Lokale Variable val im Bereich des Lambda-Ausdrucks
Function f = (val) -> { //Lambda-Ausdrucksvariable val
System.out.println(val);
};
}
}
Um ehrlich zu sein, verstehe ich den Lambda-Stil immer noch überhaupt nicht ... Ich möchte die folgende Seite über den Lambda-Mechanismus verstehen.
Kombinator für Informatik und Magie Y
Außerdem verstehe ich nicht wirklich, wann ich den Lambda-Ausdruck tatsächlich verwenden soll. Welche Methoden können Lambda-Ausdrücke akzeptieren? Ist es immer verfügbar, wenn einfache Prozesse geschrieben werden, die nicht wiederverwendet werden? Kann es nur von der Methode der Funktionsschnittstelle verwendet werden? Wie unterscheidet man es von einer Methode einer funktionalen Schnittstelle?
Es gibt viele Dinge, die ich nicht verstehe.
Recommended Posts