[Java] Generieren Sie mithilfe der Stream-API eine verengte Liste aus mehreren Listen

Datenbeispiel

Bereiten Sie die folgenden Daten vor.

** Mitarbeiterliste **

name rollType
Sato 1
Suzuki 2
Takahashi 3
Tanaka 4
Ito 5

** Rollliste **

rollType owner
1 true
2 true
3 false
4 false
5 false

Ist es nicht eine Struktur, die Sie oft in der DB sehen? Was ist, wenn Sie eine Liste von Mitarbeitern mit einem RollType wünschen, deren Eigentümer wahr ist? Ich denke "bring es mit INNER JOIN aus der DB", aber dieses Mal gehe ich davon aus, dass die Liste unabhängig existiert.

Die tatsächlich erstellte Liste lautet wie folgt.

list.java


List<Staff> staffList = Arrays.asList(
        new Staff("Sato", 1), 
        new Staff("Suzuki", 2), 
        new Staff("Takahashi", 3), 
        new Staff("Tanaka", 4), 
        new Staff("Ito", 5)
);

List<Roll> rollList = Arrays.asList(
        new Roll(1, true), 
        new Roll(2, true), 
        new Roll(3, false), 
        new Roll(4, false), 
        new Roll(5, false)
);

Staff und Roll sind die folgenden Klassen.

SampleClass.java


private class Staff {
    private final String name;
    private final Integer rollType;

    public Staff(String name, Integer rollType) {
        this.name = name;
        this.rollType = rollType;
    }

    public String getName() {
        return this.name;
    }

    public Integer getRollType() {
        return this.rollType;
    }
}

private class Roll {
    private final Integer rollType;
    private final boolean owner;

    public Roll(Integer rollType, boolean owner) {
        this.rollType = rollType;
        this.owner = owner;
    }

    public Integer getRollType() {
        return this.rollType;
    }

    public boolean isOwner() {
        return this.owner;
    }
}

Eigentlich holen

Im Folgenden bereiten wir das Thema Stream und die for-Anweisung als Vergleichsziel vor.

Notation in für Aussage

Main.java


for (Staff staff : StaffList) {
    for (Roll roll : RollList) {
        if (roll.isOwner()) {
            if (staff.getRollType() == roll.getRollType()) {
                System.out.println(staff.getName());
            }
        }
    }
}

Es ist leicht zu verstehen.

Notation im Stream

Main.java


staffList.stream()
        .filter( // 1.
                staff ->
                        rollList.stream()
                                .filter(roll -> roll.isOwner()) //2.
                                .anyMatch(roll -> // 3.
                                        staff.getRollType() == roll.getRollType()
                                )
        )
        .forEach(staff -> System.out.println(staff.getName()));

Um es kurz zu erklären

  1. Filtern Sie Mitarbeiter, deren interner Zustand wahr ist
  2. Erstellen Sie eine Rollliste, für die der Eigentümer wahr ist
  3. Gibt true zurück, wenn sich der RollType des Personals in der Rollliste befindet

Es wird.

Beide Ausführungsergebnisse

Sato Suzuki

Es wird.

Vergleich der Ausführungszeit

Generieren Sie mit jeder Notation eine neue Liste, die die Bedingungen erfüllt (für Verwendungen für eine leere Liste hinzufügen, Stream verwendet Collector). Die Ausführungszeit, wenn dies 1000000 Mal wiederholt wird, ist wie folgt.

Notation Ausführungszeit(ms)
For 135
Stream 889

Es gibt einen 6-fachen Unterschied. Ich habe es mehrmals versucht, aber dieser Unterschied hat sich (offensichtlich) nicht wesentlich verringert.

Zusätzlich zu der Tatsache, dass Stream ursprünglich nicht schnell ist, scheint die Tatsache, dass Stream einzeln im Filter generiert wird, einen großen Einfluss zu haben.

Wenn es sich um eine einfache Schleife handelt, ist sie streamartiger als die for-Anweisung, aber es ist eine Idee, dass es bisher einen Unterschied in der Leistung gibt.

Zusammenfassung

Erzielen Sie mit Stream einen Pseudo-INNER-JOIN Durch Verschachteln von Filtern ist es möglich, Listen wie Listen zu verarbeiten ... Verwenden Sie die For-Anweisung aus Sicht der Leistung leise

Wenn es eine Methode gibt, mit der derselbe Vorgang beschleunigt werden kann, kommentieren Sie dies bitte.

Verweise

Einführung in die Java Stream API So entfernen Sie doppelte Elemente aus zwei Arrays mit Java Stream und erstellen verschiedene eindeutige Klassen

Recommended Posts

[Java] Generieren Sie mithilfe der Stream-API eine verengte Liste aus mehreren Listen
Datenverarbeitung mit der Stream-API von Java 8
Versuchen Sie es mit der Stream-API in Java
Verwenden der Datenbank (SQL Server 2014) aus einem Java-Programm 2018/01/04
[java8] Um die Stream-API zu verstehen
Ich habe versucht, die Java8 Stream API zu verwenden
Mit Java Stream nach mehreren Bedingungen sortieren
Rufen Sie die Salesforce REST-API von Java aus auf
Versuchen Sie es mit der Emotion API von Android
Finden Sie den Unterschied von einem Vielfachen von 10
[Java] Von zwei Listen zu einer Array-Liste
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Java Stream API
Erstellen Sie Scala Seq aus Java, machen Sie Scala Seq zu einer Java-Liste
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
SSH-Verbindung mit SSHJ aus der Java6-App
Geben Sie den Maximalwert eines Arrays mithilfe der Java-Standardausgabe aus
Studieren von Java8 (z. B. Lesen von Dateien mit Stream)
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Verwenden Sie Java-Lambda-Ausdrücke außerhalb der Stream-API
Extrahieren Sie ein bestimmtes Element aus der Liste der Objekte
[Java] Stream API / Map
Kommen Sie zu den Abkürzungen aus den fünf Beispielen für kursive Java-Listen
Erstellen eines MOB mit dem Minecraft Java Mythicmobs-Plug-In | Vorbereitung 1
So spielen Sie eine MIDI-Datei mit der Java Sound API ab
Generieren Sie Stream aus einem Array primitiver Typen in Java
Holen Sie sich mit Java eine nicht leere Sammlung aus einem optionalen Stream
So erhalten Sie die neueste Live-Übermittlungs-ID für einen Kanal ohne Verwendung der YouTube-Daten-API
AWS Elastic Beanstalk # 1 mit Java von Grund auf neu Erstellen einer Java-Webanwendungsumgebung mit EB CLI-
Java Stream API Spickzettel
[Java] Einführung in die Stream-API
Verwenden von Docker von Java Gradle
Machen Sie einen Diamanten mit Java
[Java] Mehrere Listen (Sammlungen) kombinieren
[Java] Stream API Zwischenoperation
Sortieren Sie die Liste in absteigender Reihenfolge in Java und generieren Sie zerstörungsfrei eine neue Liste
Beispiel für die Verwendung der Bulk-API von Salesforce vom Java-Client mit PK-Chunking
Extrahieren Sie effizient mehrere Elemente zufällig und ohne Duplizierung aus der Liste
Greifen Sie von einem Java-Client aus auf das speicherinterne Datenraster Apache Ignite zu
Einfache Möglichkeit zum Erstellen einer Zuordnungsklasse bei Verwendung der API
Effektives Java-Element 25 Wählen Sie eine Liste aus einem Array aus. Erste Hälfte
Nutzen Sie entweder für die individuelle Ausnahmebehandlung in der Java Stream-API
[Gradle] Erstellen Sie ein Java-Projekt mit einer Konfiguration, die von der Konvention abweicht
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht