Es ist ungefähr zwei Monate her, seit Java 11 offiziell veröffentlicht wurde. Java ändert sich in vielerlei Hinsicht, z. B. indem Sie für das JDK bezahlen. Kehren wir nun zu den Grundlagen zurück und fassen Java 8 zusammen. Ich werde hauptsächlich die Funktionen beschreiben, die häufig verwendet werden.
Übrigens hat der Autor nur Java 7-Erfahrung bis zur vorherigen Site, Die Geschichte von Java 8 beträgt ungefähr ein halbes Jahr.
Lass uns genauer hinschauen.
Es scheint, dass es auch Closure mit einem anderen Namen genannt wird. (Ich habe noch nie jemanden gesehen, der das so nennt) Lassen Sie uns die tatsächliche Beschreibung sehen, wie es aussieht.
Sample.java
(x, y) -> {return x + y;}
/*
(Argumente der zu implementierenden Methode) -> {wird bearbeitet}
*/
... Deshalb fühlt es sich an.
Was ist der Lambda-Ausdruck überhaupt? ** Eine Funktion, mit der Sie die Implementierung einer funktionalen Schnittstelle als Ausdruck kurz beschreiben können **.
… Auch das unbekannte Wort ** Funktionsschnittstelle ** kam heraus. Stellen Sie sich das grob als eine Schnittstelle vor, auf der nur eine abstrakte Methode implementiert ist [^ 1] **.
Um es etwas detaillierter zusammenzufassen: ** Eine Funktion, mit der Sie die Implementierung einer Schnittstelle, in der nur eine abstrakte Methode implementiert ist, kurz beschreiben können **.
Lassen Sie uns beispielsweise die folgende Funktionsschnittstelle implementieren.
Sample.java
@FunctionalInterface
public interface SampleInterface {
void sayHi();
}
Lassen Sie uns die Schnittstelle normal implementieren.
SampleImpl1.java
public class SampleImple1 {
public void greeting() {
SampleInterface sample = new SampleInterface() { //Implementieren Sie die Schnittstelle
void sayHi() {
System.out.println("Hi!"); //Beschreiben Sie den Prozess, den Sie implementieren möchten
}
}
sample.sayHi(); //Ausführung verarbeiten
}
}
Ich möchte nur Hallo sagen, aber es ist sehr unangenehm, sich die Mühe machen zu müssen, eine neue Verarbeitung zu implementieren. Verwenden wir den Lambda-Ausdruck.
SampleImpl2.java
public class SampleImpl2 {
public void greeting(String name) {
SampleInterface sample = () -> System.out.println("Hi!"); //Implementierungs- und Verarbeitungsbeschreibung können kombiniert werden
sample.sayHi(): //Ausführung verarbeiten
}
}
Findest du es nicht ziemlich sauber? Prägnant zu sein ist nicht nur für den Implementierer freundlich, sondern erleichtert dem Leser auch das Verständnis des Codes, da keine redundanten Beschreibungen erforderlich sind. Dies kann sich auch positiv auf das gesamte Projekt auswirken.
Ich denke, es ist einfacher zu verstehen, ob Sie den Code tatsächlich schreiben, als Sie ihn in einem Artikel sehen oder in einem Buch wie diesem lesen. Wenn Sie es noch nicht geschrieben oder im Feld noch nicht gesehen haben, schreiben Sie es bitte! !!
Optional Optional ist mir das noch zu Dank verpflichtet. Ich persönlich finde es am bequemsten.
Um welche Art von Funktion handelt es sich? Es handelt sich um eine Funktion, die angibt, dass ** das Objekt null sein kann **. Die eigentlichen detaillierten Funktionen (Methoden) überlasse ich Official Reference. Um den diesmal eingeführten Code zu lesen, möchte ich, dass Sie nur die folgenden Methoden vorbereiten.
Werfen wir einen Blick auf die Szene, in der Sie die Beschreibung und den Geschmack tatsächlich spüren.
Schauen wir uns einen Fall an, in dem Sie eine DB-Referenz erstellen und eine eigene Ausnahme auslösen möchten, wenn Sie nichts erhalten können.
Zunächst einmal, wenn Sie Optional nicht verwendet haben.
OptionalService1.java
SampleEntity sampleEntity = sampleDao.selectById(id); //DB-Referenz ausführen
if (isNull(sampleEntity)) { //Wenn die Entität null ist
throw new ApplicationException("errorCode", "Der Wert konnte nicht von der Datenbank abgerufen werden"); //Eine Ausnahme auslösen
}
Es ist eine relativ einfache Kategorie, aber ich hasse es, eine if-Anweisung schreiben zu müssen. In diesem Beispiel müssen Sie sich keine Gedanken über das Verschachteln machen. Wenn es sich um einen Feldcode handelt, ist die Verschachtelung bereits ziemlich tief, und selbst wenn sich die Verzweigung als störend anfühlt.
Verwenden wir jetzt Optional.
OptionalService2.java
Optional<SampleEntity> sampleEntity = Optional.ofNullable(sampleDao.selectById(id))
.orElseThrow(() -> new ApplicationException("errorCode", "Der Wert konnte nicht von der Datenbank abgerufen werden"));
… Es endete in einer Zeile. Es ist etwas länger her. .. Und es kommt im Lambda-Stil heraus. Es kommt heraus, weil es bequem ist. Es ist nun mal so.
Nachfolgend finden Sie eine kurze Erklärung.
orElseThrow ()
löst eine Ausnahme aus, wenn das Erfassungsergebnis Optional.empty ()
ist.Wenn hier also keine Ausnahme ausgelöst wird, ist es sicher, dass "sampleEntity" nicht Optional.empty () ist. Einfach zu verstehen! Wenn Sie die zuvor eingeführte Referenz entfernt haben, wissen Sie Bescheid. Weitere nützliche Funktionen wie "map" und "orElseGet" werden bereitgestellt. Lass es uns benutzen!
Wie bereits erwähnt, drückt Optional aus, dass es ** null ** sein kann. Die Methode wird durch die Methode beim Umschließen mit Optional oder beim Abrufen des darin enthaltenen Werts ausgedrückt.
Verwenden Sie daher ** nicht Nullable für Objekte, die niemals null sein können (z. B. Spalten, die in DB-Einschränkungen NICHT NULL sind), sondern **. Auf diese Weise kann jeder, der den Code später sieht, verstehen, dass "dieses Element wahrscheinlich nicht null ist" **. Sie müssen keine unnötigen Tests schreiben.
Unabhängig davon, wie nützlich die Funktion ist, ist sie nur dann wirksam, wenn der Benutzer sie versteht. (Gebot)
Stream Der Name ist cool. Stream ist eine ** Funktion, mit der Sie Operationen auf Arrays und Listen präzise schreiben können **. Darüber hinaus wurden detaillierte Funktionen an Official Reference übergeben. Ich möchte, dass Sie sich auf Folgendes vorbereiten.
Nehmen wir an, dass es einen Prozess gibt, um die Namen auszugeben, die gemeinsam in der Reihenfolge von der Datenbank abgerufen werden können.
Ich werde es mit der erweiterten for-Anweisung versuchen.
ForSample.java
for (SampleEntity entity : entityList) { //Holen Sie sich den Inhalt der Liste nacheinander
System.out.println(entity.getName());
}
Ich glaube nicht, dass es viel Verarbeitung gibt, um den Namen einer Person auszugeben, ohne ruhig zu denken. Weil es ein Beispiel ist. Das Nest wird wieder tiefer sein. Ich hasse.
Verwenden wir Stream.
StreamSample.java
entityList.stream.map(x -> x.getName()).forEach(System.out::println);
Dies endete auch in einer Zeile. Und es ist kurz.
Eine kurze Erklärung.
map ()
aus der Liste abgerufen wurde, und geben Sie ihn an den Stream zurück. ** (Zwischenbetrieb) **forEach ()
führt` System.out :: println'für jedes Element des Streams aus. ** (Kündigungsoperation) **Ich denke, es ist in Ordnung, wenn Sie grob erkennen können, dass ** die Zwischenoperation die Elemente des Arrays und der Liste verarbeitet, sie im Stream speichert und die Terminaloperation sie gemeinsam für den Stream ausführt **.
Es gibt andere Methoden, die zu praktisch sind, wie "filter ()", "sorted ()" und "unique ()". Bitte versuchen Sie es auch.
Wenn ich es noch einmal schreibe, werden viele Dinge hinzugefügt, die vorhandene Funktionen leicht beschreiben können, anstatt neue Funktionen. Ich dachte auch, dass ich es tatsächlich oft benutze.
Einfach ist das Beste für großartige Leute! Ich denke, wenn Sie diese nur lesen und schreiben, werden Sie eher wie ein Ingenieur!
Bis zum Ende Danke fürs Lesen! Wir freuen uns auf Ihre Kommentare und Vorschläge! !!
[^ 1]: Ganz anders. Weitere Informationen finden Sie hier [https://qiita.com/lrf141/items/98ffbeaee42d30cca4dc#%E9%96%A2%E6%95%B0%E5%9E%8B%E3%82%A4%E3 % 83% B3% E3% 82% BF% E3% 83% BC% E3% 83% 95% E3% 82% A7% E3% 83% BC% E3% 82% B9% E3% 82% 92% E7% 90 Siehe% 86% E8% A7% A3% E3% 81% 99% E3% 82% 8B).
Recommended Posts