Java 9 wurde ebenfalls veröffentlicht, aber ich bin mir bei Java 8 immer noch nicht sicher, daher werde ich es zusammenfassen.
forEach()
In Java8 wurde die Methode forEach ()
zu List, Map, Arrays usw. hinzugefügt.
Vor Java 7
for(String s : list) {
System.out.println(s);
}
Und der Prozess, der 3 Zeilen verwendet
list.forEach(s -> System.out.println(s));
Sie können jetzt in einer Zeile schreiben.
Warum kann ich es so schreiben?
In Java8 wird eine Schnittstelle mit nur einer abstrakten Methode als funktionale Schnittstelle bezeichnet und kann als Lambda-Ausdruck übergeben werden.
FunctionalIf.java
@FunctionalInterface
public interface FunctionalIf {
public String retStr(int number);
}
Die folgenden Methoden können jedoch enthalten sein ・ Statische Methode ・ Standardmethode -Überschreibung der öffentlichen Methode von java.lang.Object (toString () und equals ())
Das Hinzufügen der Annotation @ FunctionalInterface
führt zu einem Kompilierungsfehler, wenn die Bedingungen nicht erfüllt sind, dies jedoch nicht erforderlich ist.
Lambda-Ausdrücke sind Grammatiken, die in Java 8 eingeführt wurden. Sie können eine Funktionsschnittstelle mit der folgenden Syntax implementieren
(Argumente der zu implementierenden Methode) -> {wird bearbeitet}
FunctionalIf func = (int num) -> { return num +" * 2 = " + num*2;};
Dies allein ist ziemlich prägnant, kann aber weiter weggelassen werden.
FunctionalIf func = num -> { return num +" * 2 = " + num*2;};
Da es ein Argument gibt, kann davon ausgegangen werden, dass num
vom Typ int ist.
FunctionalIf func = num -> num +" * 2 = " + num*2;
Da es sich um einen einfachen Satz handelt, kann das Ergebnis des Satzes als Ausgabe abgeleitet werden.
Am Ende hatte ich dieses Format
//Implementieren Sie eine funktionale Schnittstelle mit einem Lambda-Ausdruck
FunctionalIf func = num -> num +" * 2 = " + num*2;
//Verwenden Sie die implementierte Methode
System.out.println(func.retStr(1));
System.out.println(func.retStr(2));
Ausführungsergebnis
1 * 2 = 2
2 * 2 = 4
Die forEach () -Methode in Java 8 kann in einer Klasse verwendet werden, die die Iterable-Schnittstellenmethode default void forEach (Consumer <? Super T> -Aktion)
implementiert.
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Iterable.html#forEach-java.util.function.Consumer-
Das Argument "Consumer" ist eine funktionale Schnittstelle mit "void accept (T t)" (empfängt ein beliebiges Argument und gibt keinen Wert zurück). https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/Consumer.html
list.forEach(s -> System.out.println(s));
Sie haben also die Implementierung von "Consumer" als Argument der forEach () -Methode in einem Lambda-Ausdruck übergeben.
Variablen, die außerhalb des Lambda-Ausdrucks deklariert sind, können innerhalb des Lambda-Ausdrucks referenziert werden. Es kann jedoch nicht geändert werden.
String str = " item";
list.forEach(s -> {
System.out.println(s + str); //Kann referenziert werden
// str = " changed"; //Veränderung ist NG
});
Außerdem können außerhalb des Lambda-Ausdrucks deklarierte Variablen nicht in den Argumentnamen von Variablen verwendet werden (ein Kompilierungsfehler tritt auf).
Sie können kein einzelnes _
im Variablennamen eines Lambda-Ausdrucksarguments verwenden.
Recommended Posts