Ich benutze normalerweise Skriptsprachen.
Ich hatte die seltene Gelegenheit, Java zu berühren Über Java-Lambda-Ausdrücke wusste ich nur wenig Obwohl es die Zeit der Veröffentlichung von Java 11 ist, werde ich es zur Bestätigung zusammenfassen.
Angenommen, Sie sind in einem großartigen Spieleentwicklungsteam. Ich werde für den Teil verantwortlich sein, der sich auf den Namen des Benutzers bezieht. In Zukunft wird sich der Titel des Hauptcharakters für jeden Charakter ändern, daher wurde ich mit der Entwicklung der API beauftragt.
Definiert die Schnittstelle, die für die Formatierung des Namens verantwortlich ist.
NameFormatter.java
interface NameFormatter {
public abstract String format(String familyName, String firstName);
}
Die Implementierungsklasse und der Hauptausführungsteil sehen so aus.
Chanformatter.java
class ChanFormatter implements NameFormatter {
@Override
public String format(String familyName, String firstName){
return firstName + "Chan";
}
}
Main.java
class Main {
public static void main(String[] args){
String familyName = "Datum";
String firstName = "Masamune";
NameFormatter nf = new ChanFormatter();
String formatted = nf.format(familyName, firstName);
System.out.println("Hallo!" + formatted + "。");
System.out.println("Ich fange ein tolles Spiel an!");
}
}
Klicken Sie hier für das Ausführungsergebnis
Hallo! Masamune-Chan.
Ich fange ein tolles Spiel an!
Es ist vertraut.
Im Gegenteil, bereiten wir einen anderen Formatierer für den edlen Charakter vor.
DonoFormatter.java
class DonoFormatter implements NameFormatter {
@Override
public String format(String familyName, String firstName){
return familyName + "Tono";
}
}
Sie können den Namen einfach ändern, indem Sie einfach die neue Klasse im Hauptausführungsabschnitt ändern.
Main.java(diff)
String familyName = "Datum";
String firstName = "Masamune";
- NameFormatter nf = new ChanFormatter();
+ NameFormatter nf = new DonoFormatter();
String formatted = nf.format(familyName, firstName);
System.out.println("Hallo!" + formatted + "。");
Hallo! Datum.
Ich fange ein tolles Spiel an!
Nehmen wir an, Sie haben es satt, ein großartiges Spieleentwicklungsteam zu haben. Dies liegt daran, dass es nicht möglich ist, Personalkosten für die Wartung einer so kleinen Klassengruppe aufzuwenden. Das Entwicklungsteam hat beschlossen, den Formatierer mithilfe einer anonymen Klasse zu implementieren.
Anstatt einzelne Dateien für eine Klasse dieser Größe zu erstellen Anonyme Klasse ist eine Funktion zum Definieren und Entsorgen vor Ort.
Mit der anonymen Klasse benötigen Sie nur die folgenden zwei Dateien:
Nameformatter.java
//Erneut veröffentlichen
//Das gleiche wie oben
interface NameFormatter {
public abstract String format(String familyName, String firstName);
}
Main.java
class Main {
public static void main(String[] args){
NameFormatter chan = new NameFormatter(){
@Override
public String format(String familyName, String firstName){
return firstName + "Chan";
}
};
NameFormatter dono = new NameFormatter(){
@Override
public String format(String familyName, String firstName){
return familyName + "Tono";
}
};
String familyName = "Datum";
String firstName = "Masamune";
String formatted = chan.format(familyName, firstName);
System.out.println("Hallo!" + formatted + "。");
System.out.println("Ich fange ein tolles Spiel an!");
}
}
Es ist eine Form, in der die Formatmethode mit der Variablen verknüpft ist.
Übrigens ist es der Lambda-Ausdruck des Hauptthemas.
In einer Situation wie dieser Zeit Die einzige Methode, die die Klasse "NameFormatter" implementieren sollte, ist "Format". Daher können Sie nur die Formatmethode überschreiben. Ich halte es für überflüssig, jedes Mal mit dem öffentlichen String-Format (String familyName, String firstName) zu kopieren und einzufügen. Ich möchte, dass Sie dem Compiler mein Bestes geben.
Der Lambda-Stil ist eine Notation, die eine solche Anforderung erfüllen kann. Es kann wie folgt geschrieben werden.
Main.java
class Main {
public static void main(String[] args){
NameFormatter chan = (String familyName, String firstName) -> {
return firstName + "Chan";
};
NameFormatter dono = (String familyName, String firstName) -> {
return familyName + "Tono";
};
String familyName = "Datum";
String firstName = "Masamune";
String formatted = chan.format(familyName, firstName);
System.out.println("Hallo!" + formatted + "。");
System.out.println("Ich fange ein tolles Spiel an!");
}
}
Ich konnte klar schreiben. das ist alles.
Das war's für den Lambda-Ausdruck. Der Lambda-Ausdruck selbst ist nur eine Abkürzung für eine anonyme Klasse, kein großes Thema.
Der Hauptkreis ist kein Lambda-Typ, sondern die folgenden zwei Punkte.
--Funktionsschnittstelle (Paket java.util.function
)
Dieses Mal habe ich die ursprüngliche Schnittstelle namens "NameFormatter" verwendet.
Es werden viele Schnittstellen bereitgestellt, die Lambda-Ausdrücke verwenden sollen.
Eine davon ist java.util.function.Function <T, R>
.
Darüber hinaus wurden viele Methoden, die für Funktionstypen wie "map" und "filter" üblich sind, als Java Stream-API hinzugefügt.
Diese Methoden werden verwendet, indem die Schnittstelle von java.util.function
als Argument übergeben wird.
Lambda-Stil ist nicht beängstigend.
Ich möchte die Stream-API reibungslos verwenden können