Java8 / 9-Anfänger: Streamen Sie API-Suchtpunkte und wie Sie damit umgehen

Obwohl die von Java 8 implementierte Stream-API eine sehr nützliche Funktion ist, Da ich oft süchtig nach Stream-spezifischer Verarbeitung bin, werde ich die Gegenmaßnahmen beschreiben

1. Ich weiß überhaupt nicht, wie ich Stream aufrufen soll

Grundsätzlich reicht es aus, sich nur die folgenden Muster zu merken -Konvertieren von Sammlung zu Stream -Konvertieren Sie vom Argument Array & Variable Länge zum Stream

Grundlegender Stream-Aufruf


// Collection(List/Set etc.)Im Falle von
Collection<BigDecimal>list = List.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
Stream<BigDecimal>stream = list.stream();

//Für Arrays
BigDecimal[] array = new BigDecimal[] {BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN};
Stream<BigDecimal>stream = Stream.of(array);
//Für Argumente variabler Länge(Die gleiche Methode wie für das Array ist in Ordnung)
Stream<BigDecimal>stream = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);

//Bei der Durchführung der Int-Loop-Verarbeitung * für(int i=0; i<=100 i++)...Gleichwertige Verarbeitung
IntStream stream = IntStream.rangeClosed(0, 100);

2. Suchtpunkte, die dazu neigen, ohne es zu wissen

Ereignisse, die beim Starten des Streams auftreten können


Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed

2.1: IllegalStateException tritt auf ... Stream kann nicht wiederverwendet werden

Der Stream muss nach der Verarbeitung in einen anderen Typ konvertiert werden (Terminierungsverarbeitung) Es ist unmöglich, im Status von Stream wie List zu bleiben / wiederzuverwenden

Stream kann nicht wiederverwendet werden


Stream<String>stream = Stream.of("","","");
//Wenn Sie etwas tun, wird der Stream geschlossen (es gibt keine Problemumgehung).
stream.collect(Collectors.toCollection(ArrayDeque::new));
//Bereits geschlossene Streams können nicht wiederverwendet werden
stream.count();

//Stapelspur
//Exception in thread "main" java.lang.IllegalStateException: stream has already been //operated upon or closed
//	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
//	at java.base/java.util.stream.ReferencePipeline.count(ReferencePipeline.java:538)
//	at main.TestFunc.main(TestFunc.java:11)	

Aktion 1: Verwenden Sie Stream nicht für Variablen und Rückgabewerte. Konvertieren Sie jedes Mal mithilfe von Sammlung (Liste usw.) oder Karte in Stream

Problemumgehungsbeispiel


//Nachdem Sie die Variable in eine Sammlung eingefügt haben...
List<BigDecimal> list = List.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
//In Liste konvertieren
Deque<BigDecimal> deque = list.stream().collect(Collectors.toCollection(ArrayDeque::new));
//Zähle die Nummer. Erstellen Sie für jeden Prozess einen Stream
long count = list.stream().count();

Korrespondenz 2: (Sonderbeispiel) Verarbeitungen wie Durchschnitt, Summe und Anzahl können gemeinsam verarbeitet werden.

Verwendung von Zusammenfassungsstatistiken


List<BigDecimal> list = List.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);

//In Zusammenfassungsstatistik konvertieren. Es gibt keine Dezimalzusammenfassungsstatistik
IntSummaryStatistics summary = list.stream().collect(Collectors.summarizingInt(BigDecimal::intValueExact));

//Mit einem Stream-Prozess können mehrere Ergebnisse erzielt werden
summary.getMax();
summary.getAverage();
summary.getSum();

2.2 Stream hat keine typspezifische Methode

Zum Beispiel gibt es keine Methode zum Summen () für Stream \ .

Beispiel ohne entsprechende Methode


//Es gibt keine solche Methode
Stream.of(1,2,3).sum();

Korrespondenz 1 (für ** Basistyp **): Verwenden Sie einen speziellen Stream für den Basistyp

Beispiel für die Konvertierung in IntStream


//Mit mapToInt in IntStream konvertieren → Verwenden Sie die Methode, die IntStream speziell verwendet
Stream.of(1, 2, 3).mapToInt(e -> e).sum();

Korrespondenz 2 (im Fall von ** außer Basistyp **): Verarbeitung mit der Stream-Methode oder dem Collector

Beispiel für das Hinzufügen mit Dezimal


//Muster 1:Verarbeitung zum Hinzufügen aller Dezimalwerte in Stream mit dem Anfangswert 0=Führt den Prozess der Berechnung der Gesamtsumme durch. Verarbeitungsmethode ähnlich der herkömmlichen for-Anweisung
Stream.of(1, 2, 3).map(BigDecimal::valueOf).reduce(BigDecimal.ZERO,BigDecimal::add);

//Muster 2:Bereiten Sie einen Sammler vor und verwenden Sie ihn. Wirksam, wenn Sie es mehrmals wiederverwenden möchten
Collector<BigDecimal, ?, BigDecimal> sum = Collectors.reducing(BigDecimal.ZERO, BigDecimal::add);

Stream.of(1, 2, 3).map(BigDecimal::valueOf).collect(sum);
Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN).collect(sum);

2.3 Ich weiß nicht, wie ich zu einem Array / einer Liste / einer Karte zurückkehren soll

Grundsätzlich reicht es aus, sich nur die folgenden Muster zu merken -Konvertieren Sie vom Stream zur Sammlung -Konvertieren Sie von Stream zu Array

Konvertierung aus Stream


// List(nicht spezifiziert)Im Falle von
List<BigDecimal> list = Stream.of(BigDecimal.ZERO, BigDecimal.ONE).limit(1).collect(Collectors.toList());
//Für andere Sammlungen
Deque<BigDecimal> deque = Stream.of(BigDecimal.ZERO, BigDecimal.ONE).limit(1).collect(Collectors.toCollection(LinkedList::new));

//Für Arrays
BigDecimal[] array = Stream.of(BigDecimal.ZERO, BigDecimal.ONE).limit(1).toArray(BigDecimal[]::new);

2.4 Ich weiß nicht, wie ich mit Optional umgehen soll

In der FindFirst-Methode kann das Ergebnis null sein. Daher fügen wir es in Optional ein und fordern den Programmierer auf, zu definieren, was zu tun ist, wenn es null ist. Im optionalen Zustand ist es nicht möglich, den Inhalt zu verarbeiten (BigDecimal im folgenden Beispiel) (BigDecimal.add () usw.). Im Moment gibt es keine andere Verarbeitungsmethode als Stream, so dass es leicht ist, sich zu verlieben.

Beispiel für den Umgang mit Optional


//Error···[Typ Nichtübereinstimmung: Optional<BigDecimal>Kann nicht in BigDecimal konvertiert werden]
BigDecimal first = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN).findFirst();

Korrespondenz: Fügen Sie eine Methode hinzu, um den Inhalt aus Optional zu extrahieren

Verarbeitungsbeispiel Optional


//Wenn Sie auch davon ausgehen, dass es keine Elemente gibt(Wenn diesmal kein Element vorhanden ist, setzen Sie es auf 0)
BigDecimal first = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN).findFirst().orElse(BigDecimal.ZERO);

//Wenn es kein Element gibt, es sei denn, eine Anomalie tritt auf(Wirf NoSuchElementException)
BigDecimal first = Stream.<BigDecimal>of().findFirst().get();
//Wenn es kein Element gibt, es sei denn, eine Anomalie tritt auf(Wirf die angegebene Ausnahme aus)
BigDecimal first = Stream.<BigDecimal>of().findFirst().orElseThrow(IllegalStateException::new);

Recommended Posts

Java8 / 9-Anfänger: Streamen Sie API-Suchtpunkte und wie Sie damit umgehen
[Für Anfänger] So bedienen Sie die Stream-API nach Java 8
Verwendung der Java-API mit Lambda-Ausdrücken
So erstellen Sie eine API mit GraphQL und Rails
[Java] Arten von Kommentaren und wie man sie schreibt
[Java] Einführung in die Stream-API
[Ein Muss für einen Java-Ingenieurlehrling] Verwendung der Stream-API
So behandeln Sie Ausnahmen mit Java 8 Stream oder Optional kühl
Behandeln Sie Ausnahmen kühl mit Java 8-Lambda-Ausdrücken und der Stream-API
Aufrufen und Verwenden der API in Java (Spring Boot)
Konvertieren Sie ein zweidimensionales Array mit der Java 8 Stream-API in das CSV-Format
Umgang mit verschiedenen Versionen von rbenv und Ruby
[java8] Um die Stream-API zu verstehen
[Java] Mit Arrays.asList () zu beachtende Punkte
[Einführung in Java] Informationen zur Stream-API
Java, Arrays für Anfänger
Java 8 ~ Stream API ~ startet jetzt
Android: Umgang mit "Java-Version von '10 .0.1 'konnte nicht ermittelt werden"
Projektfacette Java Version 13 wird nicht unterstützt. Wie man damit umgeht
So kompilieren Sie Java mit VsCode & Ant
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
[Android] Wie man mit dunklen Themen umgeht
Heutzutage Java Lambda Expressions und Stream API
[Java] Wie man Dateien ausgibt und schreibt!
Der Umgang mit dem Vorkompilieren von Assets ist fehlgeschlagen.
So konvertieren Sie ein Array von Strings mit der Stream-API in ein Array von Objekten
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
twitter-4 Auswahl von Fehlern mit der von omniauth gem erstellten Twitter-Anmeldefunktion und wie man damit umgeht
Herausforderung, mit verstümmelten Zeichen mit Java AudioSystem.getMixerInfo () umzugehen
[Java] So testen Sie, ob es in JUnit null ist
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Versuchen Sie, Ruby und Java in Dapr zu integrieren
Verwendung des Java-Frameworks mit AWS Lambda! ??
Java Stream API
Verwendung von Segmented Control und zu notierenden Punkten
Wie man Java SE8 Gold bekommt und studiert
[Für Anfänger] Über Lambda-Ausdrücke und Stream-API
So greifen Sie auf Java Private-Methoden und -Felder zu
[Java] Verwendung der Kalenderklasse und der Datumsklasse
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
Aufrufen von Funktionen in großen Mengen mit Java Reflection
Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang-
[Java] So lassen Sie die Federkonstruktorinjektion mit Lombok weg
So stellen Sie Java mit Serverless Framework für AWS Lambda bereit
[Inhouse-Lernsitzung] Java-Grundlagen - Lambda-Ausdruck und Stream-API - (13.07.2017)
Umgang mit Keine Vorlage für interaktive Anfragen
[Docker-Umgebung] Umgang mit ActiveSupport :: MessageEncryptor :: InvalidMessage
Lesen von Java Memory Management und GC Viewer
[Java] Verweisen Sie auf und setzen Sie private Variablen mit Reflektion
[Rails] Umgang mit URL-Änderungen nach dem Rendern
So serialisieren und deserialisieren Sie den LocalDateTime-Typ mit GSON
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Zusammenfassung der Java-Kommunikations-API (3) Verwendung von SocketChannel