[JAVA] Bis die Implementierung der Schnittstelle Lambda wird

Einführung

Dieser Artikel ist ein Upgrade-Artikel für das anfällige Lambda. Wir werden die "anonyme Klasse", die bis zu SE7 verwendet werden kann, mit der SE8-Funktion "Lambda-Ausdruck" vergleichen.

Schließlich werden Lambda-Ausdrücke manchmal als "anonyme Funktionen" oder "anonyme Funktionen" bezeichnet und sind ein Konzept, das anonymen Klassen sehr ähnlich ist. [^ 1]

[^ 1]: Genau genommen sind "Lambda-Funktion" und "anonyme Funktion" gleich, und der Lambda-Ausdruck ist eine Notation der Lambda-Funktion.

Grob gesagt ist der Unterschied zwischen einer anonymen Klasse und einem Lambda-Ausdruck (anonyme Funktion) "Klasse oder Methode". Es versteht sich, dass derjenige, der eine anonyme Klasse definiert, eine anonyme Klasse ist und derjenige, der eine anonyme Methode definiert, ein Lambda-Ausdruck (anonyme Funktion) ist. Ich denke, dass es fast kein Problem gibt.

Annahme

Angenommen, Sie haben eine Schnittstelle mit einer Methode zur Bestimmung von Primzahlen.

Primes.java


public interface Primes {
    boolean isPrime(Integer param);
}

Gewöhnliche Implementierungsklasse

Normalerweise sind Geräte so.

PrimesImpl.java


public class PrimesImpl implements Primes {

    @Override
    public boolean isPrime(Integer param) {
        for (int i = 2; i < param; i++) {
            if (param % i == 0) {
                return false;
            }
        }
        return true;
    }
}

So nennt man es. Neu.

Main.java


public class Main {
    public static void main(String[] args) {
        System.out.println(new PrimesImpl().isPrime(7));
    }
}

Implementiert von einer anonymen Klasse

Verwenden einer anonymen Klasse:

Main.java


public class Main {
    public static void main(String[] args) {
        Primes primesInner = new Primes() {
            @Override public boolean isPrime(Integer param) {
                for (int i = 2; i < param; i++) {
                    if (param % i == 0) {
                        return false;
                    }
                }
                return true;
            }
        };
        System.out.println(primesInner.isPrime(7));
    }
}

Hauptklasse NUR, weil sie implementiert wird, während die Klasse im Inneren neu erstellt wird.

Implementierung im Lambda-Stil

Verwendung der Lambda-Formel:

Main.java


public class Main {
    public static void main(String[] args) {
        Primes primesLambda = param -> {
            for (int i = 2; i < param; i++) {
                if (param % i == 0) {
                    return false;
                }
            }
            return true;
        };
        System.out.println(primesLambda.isPrime(7));
    }
}

Es wird in der anonymen Klasse etwas weggelassen.

Der Methodenname verschwindet ebenfalls. Dies liegt daran, dass die Primes-Schnittstelle die Anforderungen der Funktionsschnittstelle erfüllt. Die Methode ist selbsterklärend, da "Funktionsschnittstelle = immer eine zu implementierende Methode".

Übrigens, wenn Primes keine Funktionsschnittstelle ist (wenn es keine zu implementierende Methode gibt), kann der Lambda-Ausdruck nicht mehrere Methoden implementieren, und es tritt ein Kompilierungsfehler auf.

Typinferenz arbeitet hart für Argumente und Rückgabewerte.

Bonus

Lambda Lambda gefällt das.

Main.java


public class Main {
    public static void main(String[] args) {
        Primes primesFunction = param -> IntStream.range(2, param).noneMatch(i -> (param % i) == 0);
        System.out.println(primesFunction.isPrime(7));
    }
}

Schreiben Sie nicht, weil Sie es nicht pflegen können! Derjenige, der wütend wird.

das ist alles Bitte lassen Sie mich wissen, wenn Sie einen Fehler machen! !! !!

Referenz

Zusammenfassung der Grammatik-Erweiterung für Kishida no Hatena Java8 Lambda

Recommended Posts

Bis die Implementierung der Schnittstelle Lambda wird
Refactor die Implementierung des Decorator-Musters mit einer funktionalen Schnittstelle
Kommentar: Über die Schnittstelle
Die Falle, die die Standardimplementierung der Java 8-Schnittstelle mit sich bringt
[Java] Funktionsschnittstelle / Lambda-Ausdruck
Bis der Code ausgeführt wird