Ich habe jetzt versucht, Java 8 zusammenzufassen

Einführung

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.

Häufig verwendete zusätzliche Funktionen

Lass uns genauer hinschauen.

Lambda

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-Typ überhaupt?

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 **.

Wann spüren Sie den Lambda-Geschmack?

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.

Eine Szene, in der Sie die tatsächliche Beschreibung und den Geschmack spüren können

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.

  1. Verwenden Sie "ofNullable ()", um "Optional.empty ()" zu erhalten, wenn der Rückgabewert von "sampleDao.selectById ()" null ist, oder "Optional ", wenn Sie etwas erhalten können. Ich werde es zurückgeben.
  2. 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!

wichtiger Punkt

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.

Eine Szene, in der Sie die tatsächliche Beschreibung und den Geschmack spüren können

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.

  1. Holen Sie sich den Namen von der Entität, die mit map () aus der Liste abgerufen wurde, und geben Sie ihn an den Stream zurück. ** (Zwischenbetrieb) **
  2. 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.

Schließlich

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

Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich habe versucht, die Unterstützung für iOS 14 zusammenzufassen
Ich habe versucht, mit Java zu interagieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, die Stream-API zusammenzufassen
Was ist Docker? Ich habe versucht zusammenzufassen
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, über JVM / Garbage Collection zusammenzufassen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, den Block mit Java zu brechen (1)
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Java8 startet jetzt ~ Optional ~
Ich habe versucht, Metaprogrammierung mit Java
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, verschiedene link_to zusammenzufassen, die dieses Mal verwendet wurden
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, C # (Indexer) zu kauen.
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, die Methode zu erklären
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, persönlich nützliche Apps und Entwicklungstools (Entwicklungstools) zusammenzufassen.
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Ich habe einen RESAS-API-Client in Java erstellt
Java 8 ~ Stream API ~ startet jetzt
C # (Polymorphismus: Polymorphismus)
Ich habe versucht, die Objektorientierung auf meine Weise zusammenzufassen.
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Active Hash zu erklären
Ich habe versucht, Google HttpClient von Java zu verwenden