Über [Java] [StreamAPI] allMatch ()

Fallstricke streamen

Es sollte beachtet werden, dass Java 8 Stream sehr praktisch ist, aber nur einen "Flow" bietet. Unter ihnen ist "all Match" sehr gefährlich! Im Gegenteil, wenn Sie es nicht vorsichtig verwenden, treten Nebenwirkungen auf. Dies liegt daran, dass allMatch eine Kurzschlussbewertung durchführt (wenn etwas nicht den Beurteilungsbedingungen entspricht, wird die nachfolgende Verarbeitung nicht fortgesetzt und die Verarbeitung endet dort).

Inhalt testen

Erstellen Sie eine Klasse, die eine Zeichenfolge enthält, bestimmen Sie, ob die Zeichenfolgenlänge für die Liste, die diese enthält, alle 5 Zeichen oder weniger beträgt, und wenn Daten mit 6 oder mehr Zeichen enthalten sind, dieses Zeichen Ein Programm, das die Zeichenfolge "sorry" anstelle einer Spalte ersetzt. Getestet mit den folgenden vier Verarbeitungsmethoden.

--A. Führen Sie allMatch direkt in der Liste aus --B. Ordnen Sie allMatch in der Stream-Verarbeitung zu und führen Sie es aus --C: Einmal zuordnen und in Liste speichern, dann einen neuen Stream öffnen und allMatch ausführen --D: Filtern Sie die Verarbeitungsergebnisse und vergleichen Sie die Nummer mit der Listenlänge des Ziels, das den Stream streamt.

Beispielcode. Ich denke es ist einfach.

MyProject.java


public class MyProject {

    public static void main(String[] args) {

        List<String> baseStrList = Arrays.asList("test", "tetetete", "tetetete", "tetetete", "tetetete");
        List<TestData> listA = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
        List<TestData> listB = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
        List<TestData> listC = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
        List<TestData> listD = baseStrList.stream().map(TestData::new).collect(Collectors.toList());

        boolean a = listA.stream().allMatch(TestData::checkLength);
        boolean b = listB.stream().map(TestData::checkLength).allMatch(e -> e);
        List<Boolean> list3Temp = listC.stream().map(TestData::checkLength).collect(Collectors.toList());
        boolean c = list3Temp.stream().allMatch(e -> e);
        boolean d = listD.size() == listD.stream().filter(TestData::checkLength).count();

        System.out.println("a:" + a + ", list:" + listA.toString());
        System.out.println("b:" + b + ", list:" + listB.toString());
        System.out.println("c:" + c + ", list:" + listC.toString());
        System.out.println("d:" + d + ", list:" + listD.toString());
    }


    public static class TestData {
        public String content = "fefe";

        @Override
        public String toString() {
            return content;
        }

        public TestData(String a) {
            this.content = a;
        }

        public boolean checkLength() {

            if (getContent().length() > 5) {
                setContent("sorry");
                return false;
            }
            return true;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }
}

Ergebnis

a:false, list:[test, sorry, tetetete, tetetete, tetetete]
b:false, list:[test, sorry, tetetete, tetetete, tetetete]
c:false, list:[test, sorry, sorry, sorry, sorry]
d:false, list:[test, sorry, sorry, sorry, sorry]

Ergebnisüberlegung

--A: Aufgrund der Kurzschlussauswertung von allMatch wird sorry nur dem zweiten Element zugewiesen, und die Elemente danach bleiben unverarbeitet. --B: Auch wenn Sie map () der Stream-API in die Hände von allMatch () legen, ist das Ergebnis leider dasselbe wie A. --C: Da eine neue Liste einmal erstellt wird, ist sie ineffizient, aber alle Elemente werden korrekt verarbeitet. --D: Dies sollte effizienter sein als c, da keine neue Liste generiert wird. .. ..

Aus dem Obigen können wir ersehen, dass wir verstehen müssen, wie man allMatch richtig verwendet.

Ich persönlich denke, wenn Sie allMatch verwenden, ist dies nur dann der Fall, wenn Sie die Liste auf irgendeine Weise überprüfen möchten. Wenn die Daten wie dieses Mal beschädigt sind oder wenn Sie eine spezielle Verarbeitung durchführen und die Ergebnisse aggregieren, ist es besser, die C- oder D-Methode zu verwenden.

[2017/10/23 09:40 postscript] Natürlich ist allMatch für leere Listen auch wahr, seien Sie also vorsichtig. Das gleiche Ergebnis kann mit der D-Methode erzielt werden.

Apropos

Wenn Sie Lombok verwenden, wird es einfacher, also lassen Sie es uns verwenden.

MyProject.java



import lombok.Data;
import lombok.val;

import java.util.Arrays;
import java.util.stream.Collectors;

public class MyProject {

    public static void main(String[] args) {

        val baseStrList = Arrays.asList("test", "tetetete", "tetetete", "tetetete", "tetetete");
        val listA = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
        val listB = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
        val listC = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
        val listD = baseStrList.stream().map(TestData::new).collect(Collectors.toList());

        val a = listA.stream().allMatch(TestData::checkLength);
        val b = listB.stream().map(TestData::checkLength).allMatch(e -> e);
        val list3Temp = listC.stream().map(TestData::checkLength).collect(Collectors.toList());
        val c = list3Temp.stream().allMatch(e -> e);


        val d = listD.size() == listD.stream().filter(TestData::checkLength).count();

        System.out.println("a:" + a + ", list:" + listA.toString());
        System.out.println("b:" + b + ", list:" + listB.toString());
        System.out.println("c:" + c + ", list:" + listC.toString());
        System.out.println("d:" + d + ", list:" + listD.toString());
    }
    
    @Data
    public static class TestData {
        public String content = "fefe";

        @Override
        public String toString() {
            return content;
        }

        public TestData(String a) {
            this.content = a;
        }

        public boolean checkLength() {

            if (getContent().length() > 5) {
                setContent("sorry");
                return false;
            }
            return true;
        }
    }
}

Recommended Posts

Über [Java] [StreamAPI] allMatch ()
Über die Java-Schnittstelle
[Java] Informationen zu Java 12-Funktionen
[Java] Über Arrays
Etwas über Java
Wo ist mit Java?
Informationen zu Java-Funktionen
Über Java-Threads
[Java] -Schnittstelle
Über die Java-Klasse
Informationen zu Java-Arrays
Über Java-Vererbung
Über Schnittstelle, Java-Schnittstelle
Über Java Var
Über Java Literal
Informationen zu Java-Befehlen
Informationen zur Java-Protokollausgabe
Informationen zur Java-Funktionsschnittstelle
Java, über zweidimensionales Array
Über die Klassenteilung (Java)
Informationen zur Java StringBuilder-Klasse
[Java] Über Singleton Class
Informationen zur Bindung von Java-Methoden
[Java] Über anonyme Klassen
Informationen zu Aufteilungsmethoden (Java)
[Java Silver] Informationen zur Initialisierung
Informationen zur Java-Array-Liste
Über Java-Polymorphismus super ()
Informationen zur Vererbung (Java Silver)
Informationen zur Java String-Klasse
Informationen zu Java-Zugriffsmodifikatoren
Über Java-Lambda-Ausdrücke
Informationen zu Java-Einstiegspunkten
Java 10 Docker-Unterstützung
Persönliche Zusammenfassung über Java
Über die abstrakte Klasse von Java
Hinweise zu Java GC
Über Java-Instanzen
Was ich über Java 6 recherchiert habe
[Gradle] Informationen zu Java-Plug-In-Aufgaben
Informationen zu Java-Variablendeklarationsanweisungen
Was ich über Java 9 recherchiert habe
[Java] Informationen zur Behandlung von Try-Catch-Ausnahmen
Informationen zu Java Class Loader-Typen
[Java Silver] Über gleich Methode
[Java] Über String und StringBuilder
Was ich über Java 7 recherchiert habe
Informationen zu Alibaba Java-Codierungsrichtlinien
Java-Klasse Variable Klassenmethode
Über Java-Paket und Import
Über Java Abstract Class
[Android / Java] Erfahren Sie mehr über DataBinding
Was ich über Java 5 recherchiert habe
Informationen zu statischen und nicht statischen Java-Methoden
Wie wäre es mit TECH ACADEMY? [Java-Kurs]
[Einführung in Java] Über Lambda-Ausdrücke
Über Biocontainer fastqc und Java
Über Lambda, Stream, LocalDate von Java8