Der Ursprung von Java-Lambda-Ausdrücken

Java Lambda Ausdruck

Einführung

Ich bin liitFeet, ein serverseitiger Ingenieur. Vor kurzem habe ich Lust auf Coroutine WebFlux ausschließlich mit Kotlin und Spring Boot. Coroutine schwierig ...

Dieser Artikel ist der 7. Tag des TeamLab Engineering-Adventskalenders.

In diesem Artikel werde ich den Ursprung von Java-Lambda-Ausdrücken erläutern. Eh jetzt? Es gibt ein solches Gefühl, aber jetzt, da ich Funktionen wie go und kotlin als erstklassige Objekte verarbeiten kann, dachte ich, dass ich den Inhalt des Lambda-Ausdrucks tatsächlich verwende, ohne zu wissen, was es ist.

Unter dem Strich implementieren Java-Lambda-Ausdrücke eine Schnittstelle mit nur einer Methode zum Erstellen einer Instanz (neu). Ich halte diese Erklärung nicht für verwirrend, daher erkläre ich den Vorgang bis zum Lambda-Ausdruck der Reihe nach anhand eines Programms, das das Ergebnis der Berechnung eines bestimmten Ausdrucks als Beispiel anzeigt.

  1. Übergeben Sie eine normale Klasse als Argument
  2. Übergeben Sie die innere Klasse als Argument
  3. Übergeben Sie eine anonyme Klasse als Argument
  4. Übergeben Sie den Lambda-Ausdruck als Argument

Ich denke, es ist einfacher zu verstehen, wenn Sie wissen, dass Lambda-Ausdrücke sowohl für Menschen als auch für Compiler leicht zu lesen sind, während die Anzahl der Beschreibungen reduziert wird.

In diesem Artikel wird auch der Ursprung von Java-Lambda-Ausdrücken beschrieben. Bitte beachten Sie, dass wir den Lambda-Ausdruck selbst nicht im Detail erklären werden (wenn es nur ein Argument gibt, müssen Sie keine Klammern, Funktionsschnittstellen usw. schreiben).

Den Quellcode finden Sie unter GitHub.

Übergeben Sie eine normale Klasse als Argument

Zunächst möchte ich ein Programm realisieren, das das berechnete Ergebnis durch Übergeben einer normalen Klasse anzeigt. Der Quellcode ist das normalClass-Paket. Es gibt vier Quellen unten.

Main.Java Hauptklasse
Display.Java-Klasse zur Anzeige des Berechnungsergebnisses
CalcuratorInterface.Für die Java-Berechnung definierte Schnittstelle
Display.java                CalcuratorInterface

Zunächst erhält sie in der Anzeigeklasse den für die Berechnung zuständigen Rechner und den zu berechnenden Wert (a, b). Berechnen Sie den Wert von (a, b) und zeigen Sie ihn mit dem Taschenrechner an.

public class Display {
    public void showCalc(CalculatorInterface calculator, int a, int b) {
        System.out.println(calculator.calc(a, b));
    }
}

CalculatorInterface definiert calc, eine Methode, die Berechnungen durchführt.


public interface CalculatorInterface {
    int calc(int a, int b);
}

AddCalculator implementiert CalculatorInterface und gibt die Summe der Argumente (a, b) zurück.

public class AddCalculator implements CalculatorInterface {

    @Override
    public int calc(int a, int b) {
        return a + b;
    }
}

In der Hauptklasse wird das Berechnungsergebnis angezeigt, indem der berechnete Wert als `` `Rechner``` an die Anzeigeklasse übergeben wird.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();
        CalculatorInterface calculator = new AddCalculator();
        display.showCalc(calculator, 3, 5);
    }
}

Ich denke, es gibt kein besonderes Problem.

Lieferung in der inneren Klasse

Als nächstes möchte ich die innere Klasse verwenden. Der Quellcode ist das Paket innerClass. CalcuratorInterface.java und Display.java bleiben unverändert.

Wenn Sie die oben erwähnte normale Klasse verwenden, halten Sie es nicht für problematisch, eine Klassendatei nur für den Zusatz zu erstellen, der nur für die Hauptklasse verwendet wird? Daher können Sie AddCalculator.java entfernen, indem Sie AddCalculator in Main wie unten gezeigt definieren.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();

        //Definiere die innere Klasse
        class AddCalculator implements CalculatorInterface {

            @Override
            public int calc(int a, int b) {
                return a + b;
            }
        }

        CalculatorInterface calculator = new AddCalculator();
        display.showCalc(calculator, 3, 5);
    }
}

Übergeben Sie eine anonyme Klasse als Funktion

Als nächstes werden wir die anonyme Klasse verwenden. Der Quellcode ist das anonymInnerClass-Paket. Ich habe die innere Klasse verwendet und musste keine Klassendatei erstellen, aber wenn ich sie hier nur einmal verwende, muss ich diese Klasse nicht benennen. Lassen Sie uns daher die Klasse zum Zeitpunkt der Zuweisung zum Taschenrechner vor Ort implementieren.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();

        //Einmal wegwerfbar
        CalculatorInterface calculator = new CalculatorInterface() {
            @Override
            public int calc(int a, int b) {
                return a + b;
            }
        };
        display.showCalc(calculator, 3, 5);
    }
}

Dies ist eine anonyme Klasse. Es kann nicht wiederverwendet werden, aber die Anzahl der Beschreibungen hat sich allmählich verringert.

Lambda-Stil

Schließlich Argumente mit Lambda-Ausdrücken übergeben. Der Quellcode lautet lambdaExpression Package. Durch die Verwendung einer anonymen Klasse konnte ich den Namen der Klasse weglassen und die Anzahl der Beschreibungen reduzieren. Wenn Sie jedoch CalculatorInterface implementieren, scheint es, dass der Compiler dies für Sie erledigt, ohne `new CalculatorInterface ()` zu schreiben. Wenn es nur eine Methode gibt, wird außerdem eindeutig bestimmt, welche Methode implementiert werden soll. Der Typ des Methodenarguments wird auch in der Schnittstelle definiert, und der Compiler kann auf den Typ schließen, ohne ihn zu deklarieren.

In Lambda-Ausdrücken können Sie eine Instanz erstellen, indem Sie nur die für die Implementierung erforderlichen Methoden schreiben.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();

        //Nur die Verarbeitung der zu implementierenden Methode
        CalculatorInterface calculator = (a, b) -> {
            return a + b;
        };

        display.showCalc(calculator, 3, 5);
    }
}

Der Lambda-Ausdruck ist der folgende Teil. Dieser Teil stellt die Implementierung der calc-Methode von CalculatorInterface dar.

(a, b) -> {
    return a + b;
};

(a, b)Ist ein Argument. Ich mache mir nicht die Mühe, das Methodenargument zu schreiben, da der Typ in der Schnittstelle definiert ist. ->Das Folgende ist die Implementierung der Methode.a+bKommt zurück.

Zusammenfassung

Was haben Sie gedacht. Ich hoffe, Sie können die Bedeutung des Schreibens "Java Lambda-Ausdruck implementiert eine Schnittstelle mit nur einer Methode und erstellt eine Instanz (neu)" am Anfang verstehen!

Es ist eine völlige Seite, aber es wäre schön, wenn Sie die Funktion als erstklassiges Objekt wie Kotlin behandeln könnten ... Die Argumente sind leicht zu verstehen ...

val calculator = {a: Int, b: Int -> a + b}
showCalc(calculator, 3, 5)
fun showCalc(calc: (Int, Int) -> Int, a: Int, b: Int) {
  println(calc.invoke(a, b))
}

Recommended Posts

Der Ursprung von Java-Lambda-Ausdrücken
Verwenden Sie Java-Lambda-Ausdrücke außerhalb der Stream-API
Verstehen Sie Java 8 Lambda-Ausdrücke
Erläutern Sie Java 8-Lambda-Ausdrücke
[Java] Zusammenfassung, wie Lambda-Ausdrücke weggelassen werden
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Einführung in den Lambda-Ausdruck
[Java Silver] Zusammenfassung der Punkte im Zusammenhang mit Lambda-Ausdrücken
[Für Anfänger] Verstehen Sie schnell die Grundlagen von Java 8 Lambda
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Java-Lambda-Ausdruck, der mit Comparator gelernt wurde
[Java] Löschen Sie die Elemente von List
[Einführung in Java] Über Lambda-Ausdrücke
[Java Edition] Geschichte der Serialisierung
Über Lambda, Stream, LocalDate von Java8
Verwendung von Java-Lambda-Ausdrücken
Verstehe die Lambda-Formel ein wenig
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
Untersuchen Sie die Liste der in AWS Lambda + Java verfügbaren Schriftarten
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
Holen Sie sich das Ergebnis von POST in Java
Nennen Sie eine Gruppe regulärer Ausdrücke (Java)
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Untersuchen Sie die Speichernutzung von Java-Elementen
Lassen Sie uns nun den Java-Lambda-Ausdruck rekapitulieren
[Java] Ermittelt den Tag eines bestimmten Tages
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Vergleichen Sie Elemente eines Arrays (Java)
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Was sind die aktualisierten Funktionen von Java 13
Rückblick auf die Grundlagen von Java
Ausgabe des Buches "Einführung in Java"
Die Geschichte des Schreibens von Java in Emacs
[Java] Überprüfen Sie die Anzahl der Zeichen
Hallo Java Lambda
[Java] Lambda-Ausdruck
[Java] Übersicht über Java
Java Lambda Ausdruck
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Behandlung von Java Beans in der Methodenkette
JAVA: jar, aar, zeige den Inhalt der Datei an
Die Geschichte eines gewöhnlichen Othello in Java
[Android] [Java] Verwalten Sie den Status der CheckBox von ListView
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
Über die Idee anonymer Klassen in Java
[Java] Zugriff auf die signierte URL von s3 (signierte Version 2)
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
[Java] Ermittelt die Länge der Ersatzpaarzeichenfolge
[Java] Der verwirrende Teil von String und StringBuilder
[Hinweis] Java: Messen Sie die Geschwindigkeit der Zeichenfolgenverkettung
Ich habe die Eigenschaften von Java und .NET verglichen
[Java] Achten Sie auf den Schlüsseltyp der Karte
Berechnen Sie die Ähnlichkeitsbewertung von Zeichenketten mit JAVA
Probieren Sie Progate Free Edition [Java II]
[Java / Kotlin] Ändern Sie die Größe unter Berücksichtigung der Ausrichtung des Bildes
Das Datum und die Uhrzeit von java8 wurden aktualisiert
Importieren Sie Dateien derselben Hierarchie in Java
Erster Touch der Files-Klasse (oder Java 8)