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.
Angenommen, Sie haben eine Schnittstelle mit einer Methode zur Bestimmung von Primzahlen.
Primes.java
public interface Primes {
boolean isPrime(Integer param);
}
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));
}
}
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.
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.
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! !! !!
Zusammenfassung der Grammatik-Erweiterung für Kishida no Hatena Java8 Lambda
Recommended Posts