Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang-

Ich höre oft "Ich habe versucht, mit Java8 zu streamen, aber ich bin nicht daran gewöhnt" oder "Ich kann es nicht tun, wenn ich versuche, etwas Schwieriges zu tun", also fasse ich es zusammen.

Wenn Sie den Typ kennen, scheinen Sie 80% zu kennen. Machen wir also ein Bild daraus.

~~ Der Artikel ist übrigens lang, aber es reicht aus, die erste Überschrift "[Hauptgeschichte-") zu lesen! ~~

Es ist zu lang, um ruhig zu denken, also habe ich es geteilt.

[Hauptgeschichte --java8 stream]: filtern, zuordnen, reduzieren

Lassen Sie uns die drei grundlegenden Hände gedrückt halten.

Sie sind vielleicht nicht mit "Reduzieren" vertraut, aber es ist ein von Google empfohlenes "MapReduce" -Modell, daher wird es mit "Karte" besprochen. -> wiki

Schauen wir uns das folgende Beispiel an.

/*
 *Es gibt das folgende Protokoll
 *Etikett oder Etikett:Ausgabe zeilenweise im Millisekundenformat
 *
 *Finden Sie die Summe von Millisekunden
 */
List<String> lines = Arrays.asList(
    "application-boot", "access-dispatch:10", "dispatched", "authentication:30", "database-access:45", "response-creation:15", "access-logging"
);

Das Wichtigste ist der Typ. Haben Sie also keine Angst vor Generika und überprüfen Sie ihn einfach.

Dann werden viele solcher Bilder herauskommen.

legend.png

A-> B f wird im Java-Code alsB f (a);geschrieben, und A und B sind String undOptional <Integer>. Enthält einen bestimmten Typ wie. Mit anderen Worten, Generika.

filter Die Definition von "Filter" ist wie folgt.

Stream<T> filter(Predicate<? super T> predicate);

Vergessen Sie "Prädikat ", dass "das Argument" T "ist und der Rückgabewert" bool "ist" und "? Super T".

Nehmen wir die Typennotation von "Prädikat " als "T to bool" und schreiben "(T-> bool)". Übrigens, vereinfachen wir auch Generika.

Stream<T> filter((T -> bool) f);

Um "Filter" zu verwenden, um "Zeilen" nur mit ":" zu erstellen, können Sie schreiben:

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]

Wenn Sie die Definition als "T-> bool" schreiben, sieht die Implementierung "line-> line.contains (": ")" gleich aus. (In diesem Thema ist "T" speziell "String")

Ist es so, wenn es auf einem Bild gezeichnet wird?

filter.png

filter bedeutet, dass sich der ** Typ ** nicht ändert, aber die ** Nummer ** ändert.

map Die Definition von "Karte" ist wie folgt.

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

In gleicher Weise wird dies auch vereinfacht.

Stream<R> map((T -> R) f);

Verwenden von map, um die Zeile von label zu erstellen: millisec`` Integer kann wie folgt nach filter geschrieben werden.

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]
        .map(line -> Integer.valueOf(line.split(":")[1]))    // [10, 30, 45, 15]

Auch hier hat die Implementierung die gleiche Form wie die Definition T-> R. (In diesem Thema ist R speziell Integer, daher wäre es schön, wenn T-> R wie String-> Integer aussieht.)

Ist es so, wenn es auf einem Bild gezeichnet wird?

map.png

map bedeutet, dass sich die ** Nummer ** nicht ändert, aber der ** Typ ** ändert.

reduce Es gibt drei Definitionen von "Reduzieren" im Java8-Stream, aber das werde ich jetzt verwenden.

T reduce(T identity, BinaryOperator<T> accumulator);

BinaryOperator <T> ist ein wenig unbekannt, aber es bedeutet "zwei Argumente sind T und der Rückgabewert ist T ". Vereinfachen wir dies, ohne Angst zu haben.

T reduce(T t, ((T, T) -> T) f);

"Reduzieren" wird im Allgemeinen als "Faltung" bezeichnet und ist ein Prozess, bei dem Ergebnisse in der Reihenfolge ganz oben auf der Liste gesammelt werden.

Um mit "Reduzieren" eine Zeile aus "Ganzzahl" zur Summe von "Ganzzahl" zu machen, können Sie diese nach "Karte" schreiben.

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]
        .map(line -> Integer.valueOf(line.split(":")[1]))    // [10, 30, 45, 15]
        .reduce(0, (acc, n) -> acc + n)                      // 100

Die Definition enthält einige Klammern, die jedoch etwas einfacher zu verstehen sein sollten, da T, (T, T) -> T und 0, (acc, n) -> ... dieselbe Form haben.

Ist es so, wenn es auf einem Bild gezeichnet wird?

reduce with zero a.png

redu ist ein Prozess, bei dem ** Listenelemente ** zu ** Einzelergebnissen ** werden.

Zusammenfassung

Das ist klar!

 *Finden Sie die Summe von Millisekunden

Ist

// (Erneut veröffentlichen)

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]
        .map(line -> Integer.valueOf(line.split(":")[1]))    // [10, 30, 45, 15]
        .reduce(0, (acc, n) -> acc + n)                      // 100

Ich habe es mit gelöst.

Vorerst werde ich das ganze Bild posten.

resolve.png

Ende

Alle Extras von hier an wurden in die folgenden Artikel unterteilt.

Listenverarbeitung unter Bildern verstanden --java8 stream / javaslang --bonus

Erfrischend.

Recommended Posts

Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang-
Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang --bonus
[java8] Um die Stream-API zu verstehen
Java8-Listenkonvertierung mit Stream Map
[Java] Stream-Verarbeitung
Beispielcode zum Konvertieren von List in List <String> in Java Stream
Java zum Spielen mit Function
[Java] Stream API - Stream-Beendigungsverarbeitung
[Java] Stream API - Stream Zwischenverarbeitung
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
[Java] Einführung in die Stream-API
Java-Thread locker zu verstehen
So behandeln Sie Ausnahmen mit Java 8 Stream oder Optional kühl
Ich möchte eine Liste mit Kotlin und Java erstellen!
Konvertieren Sie ein zweidimensionales Array mit der Java 8 Stream-API in das CSV-Format
[Java 8] Doppelte Löschung (& doppelte Überprüfung) mit Stream
Java mit Ramen lernen [Teil 1]
[Java] Mit Arrays.asList () zu beachtende Punkte
[Einführung in Java] Informationen zur Stream-API
Delegieren Sie Java-Verarbeitung an JavaScript
Wagen Sie es, Kaggle mit Java herauszufordern (1)
[Java] Elementexistenzprüfung mit Stream
[Verarbeitung × Java] Verwendung von Variablen
Ich habe versucht, mit Java zu interagieren
[Java] Konvertiere 1 in N Liste in Karte
[Java] Verwendung von List [ArrayList]
Serververarbeitung mit Java (Einführung Teil.1)
Überraschend tiefe Java-Liste Inversion-Stream-Verarbeitung
Grundlegender Verarbeitungsablauf von Java Stream
Java, Arrays für Anfänger
Java 8 ~ Stream API ~ startet jetzt
[Java] Konvertierung von Array zu Liste
[Verarbeitung × Java] Verwendung von Arrays
Java-Array / Liste / Stream gegenseitige Konvertierungsliste
[Java] [ibatis] So erhalten Sie 1-zu-N-Beziehungsdatensätze mit List <Map <>>
Ich möchte Group By-Verarbeitung mit Stream durchführen (Group-by-Count, Group-by-Sum, Group-by-Max).
Java8 / 9-Anfänger: Streamen Sie API-Suchtpunkte und wie Sie damit umgehen
[Java] Listen- / Kartenelemente mit Iterator abrufen
Datenverarbeitung mit der Stream-API von Java 8
So kompilieren Sie Java mit VsCode & Ant
Java-Referenz zum Verständnis in der Abbildung
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
[Java] Hinzufügen von Daten zur Liste (add, addAll)
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
[Verarbeitung × Java] Verwendung der Schleife
Ändern Sie die Liste <Optional <T >> in Java in Optional <Liste <T >>
[Java] Map # Merge ist schwer zu verstehen.
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
Einfach mit regulären Java-Ausdrücken zu stolpern
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
[Java] Verschiedene Methoden, um den in List gespeicherten Wert durch iterative Verarbeitung zu ermitteln
[Java] Verstehe den Unterschied zwischen List und Set
Herausforderung, mit verstümmelten Zeichen mit Java AudioSystem.getMixerInfo () umzugehen
[Java] Von zwei Listen zu einer Array-Liste
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Einführung in Algorithmen mit Java --Search (Bit Full Search)
Stellen Sie Java-Webanwendungen mit maven in Azure bereit
Einfaches Hindernisrennen mit Java-Verarbeitung