[Java] Générez une liste restreinte à partir de plusieurs listes à l'aide de l'API Stream

Exemple de données

Préparez les données suivantes.

** Liste du personnel **

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

** Liste des rouleaux **

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

N'est-ce pas une structure que vous voyez souvent dans DB? Que faire si vous voulez une liste de Staff avec un rollType dont le propriétaire est vrai? Je pense "apportez-le de DB avec INNER JOIN", mais cette fois je suppose que la liste existe indépendamment.

La liste effectivement préparée est la suivante.

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 and Roll sont les classes suivantes.

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;
    }
}

En fait chercher

Ci-dessous, nous préparerons le thème Stream et l'instruction for comme cible de comparaison.

Notation pour la déclaration

Main.java


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

C'est facile à comprendre.

Notation dans le flux

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()));

Pour expliquer brièvement

  1. Filtrer le personnel dont la condition interne est vraie
  2. Générez une liste des rôles dont le propriétaire est vrai
  3. Renvoie true si le type de rouleau de Staff est dans la liste Roll

Il devient.

Les deux résultats d'exécution

Sato Suzuki

Il devient.

Comparaison du temps d'exécution

Générer une nouvelle liste qui remplit les conditions en utilisant chaque notation (pour les utilisations ajouter pour une liste vide, Stream utilise Collector), Le temps d'exécution lorsque ceci est répété 1000000 fois est le suivant.

notation Temps d'exécution(ms)
For 135
Stream 889

Il y a une différence de 6 fois. Je l'ai essayé plusieurs fois, mais cette différence n'a pas diminué de manière significative (évidemment).

En plus du fait que Stream n'est pas rapide à l'origine, il semble que le fait que Stream soit généré un par un dans le filtre ait un impact important.

S'il s'agit d'une simple boucle, elle ressemble plus à un flux que l'instruction for, mais c'est une idée qu'il y a une différence de performances jusqu'à présent.

Résumé

Réaliser une pseudo INNER JOIN en utilisant Stream En imbriquant des filtres, il est possible de gérer des listes telles que des listes ... Utilisez l'instruction For discrètement du point de vue des performances

S'il existe une méthode qui permet d'accélérer la même opération, veuillez commenter.

Les références

Introduction à l'API Java Stream Comment supprimer les éléments en double de deux tableaux avec Java Stream et créer diverses classes uniques

Recommended Posts

[Java] Générez une liste restreinte à partir de plusieurs listes à l'aide de l'API Stream
Traitement des données à l'aide de l'API de flux de Java 8
Essayez d'utiliser l'API Stream en Java
Utilisation de la base de données (SQL Server 2014) à partir d'un programme Java 04/01/2018
[java8] Pour comprendre l'API Stream
J'ai essayé d'utiliser l'API Java8 Stream
Trier par plusieurs conditions à l'aide de Java Stream
Accédez à l'API REST Salesforce depuis Java
Essayez d'utiliser l'API Emotion d'Android
Trouvez la différence à partir d'un multiple de 10
[Java] De deux listes à une liste de tableaux
ChatWork4j pour l'utilisation de l'API ChatWork en Java
[Java] Obtenez et affichez la date 10 jours plus tard à l'aide de l'API Time ajoutée à partir de Java 8.
API Java Stream
Créer Scala Seq à partir de Java, faire de Scala Seq une liste Java
Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Connexion SSH à l'aide de SSHJ à partir de l'application Java 6
Sortie de la valeur maximale d'un tableau à l'aide de la sortie standard Java
Etudier java8 (comme lire des fichiers à l'aide de Stream)
[Java] Trier la liste à l'aide de flux et d'expressions lambda
Utiliser des expressions Java lambda en dehors de l'API Stream
Extraire un élément spécifique de la liste des objets
[Java] API / carte de flux
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
Création d'un MOB à l'aide du plug-in Minecraft Java Mythicmobs | Préparation 1
Comment lire un fichier MIDI à l'aide de l'API Java Sound
Générer un flux à partir d'un tableau de types primitifs en Java
Obtenir une collection non vide à partir d'un flux facultatif avec java
Comment obtenir le dernier ID de diffusion en direct pour une chaîne sans utiliser l'API de données YouTube
AWS Elastic Beanstalk # 1 avec Java à partir de zéro - Création d'un environnement d'application Web Java à l'aide de l'interface de ligne de commande EB-
Aide-mémoire de l'API Java Stream
[Java] Introduction à l'API Stream
Utilisation de Docker depuis Java Gradle
Faire un diamant en utilisant Java
[Java] Combiner plusieurs listes (collections)
[Java] Opération intermédiaire de l'API Stream
Trier la liste par ordre décroissant en Java et générer une nouvelle liste de manière non destructive
Exemple d'utilisation de l'API Bulk de Salesforce à partir d'un client Java avec PK-chunking
Extraire efficacement plusieurs éléments de la liste de manière aléatoire et sans duplication
Accédez à la grille de données en mémoire Apache Ignite à partir d'un client Java
Un moyen simple de créer une classe de mappage lors de l'utilisation de l'API
Élément Java effectif 25 Sélectionnez une liste dans un tableau Première moitié
Tirez parti de l'un ou l'autre pour la gestion des exceptions individuelles dans l'API Java Stream
[Gradle] Construisez un projet Java avec une configuration différente de la convention
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream