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
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);
Ereignisse, die beim Starten des Streams auftreten können
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
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();
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);
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);
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