À propos de [Java] [StreamAPI] allMatch ()

Pièges du ruisseau

Il est à noter que Java 8 Stream est très pratique, mais il ne fournit qu'un "flux". Parmi eux, «All Match» est très dangereux! Au contraire, si vous ne l'utilisez pas avec précaution, des effets secondaires se produiront. En effet, allMatch évalue un court-circuit (s'il y a quelque chose qui ne remplit pas les conditions de jugement, le traitement suivant n'est pas poursuivi et le traitement s'arrête là).

Tester le contenu

Créez une classe qui contient une chaîne de caractères, déterminez si la longueur de la chaîne de caractères est de 5 caractères ou moins pour la liste qui la contient, et si des données de 6 caractères ou plus sont incluses, ce caractère Un programme qui remplace la chaîne «désolé» au lieu d'une colonne. Testé avec les quatre méthodes de traitement suivantes.

--A. Exécuter allMatch directement sur la liste --B. Mappez puis exécutez allMatch dans le traitement de flux --C: mappez et enregistrez une fois dans la liste, puis ouvrez un nouveau flux et exécutez allMatch --D: filtrez les résultats du traitement et comparez le nombre avec la longueur de la liste de la cible qui diffuse le Stream.

Exemple de code. Je pense que c'est facile.

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

résultat

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]

Prise en compte des résultats

--A: En raison de l'évaluation des courts-circuits de allMatch, sorry est attribué uniquement au deuxième élément, et les éléments qui suivent sont laissés non traités. --B: Même si vous mettez map () de Stream API, elle est entre les mains de allMatch (), donc malheureusement le résultat est le même que A. --C: Puisqu'une nouvelle liste est créée une fois, elle est inefficace, mais tous les éléments sont traités correctement. --D: Cela devrait être plus efficace que c car il ne génère pas de nouvelle liste. .. ..

De ce qui précède, nous pouvons voir que nous devons comprendre comment utiliser correctement allMatch.

Personnellement, lorsque vous utilisez allMatch, je pense que ce n'est que lorsque vous souhaitez vérifier la liste d'une manière ou d'une autre. Si les données sont corrompues comme cette fois, ou si vous effectuez un traitement spécial et agrégez les résultats, il semble préférable d'utiliser la méthode C ou D.

[2017/10/23 09:40 postscript] De plus, bien sûr, allMatch pour les listes vides est vrai, alors soyez prudent. Le même résultat peut être obtenu avec la méthode D.

Au fait

Si vous utilisez lombok, ce sera plus facile, alors utilisons-le.

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

À propos de [Java] [StreamAPI] allMatch ()
À propos de l'interface Java
[Java] À propos des fonctionnalités de Java 12
[Java] À propos des tableaux
Quelque chose à propos de java
Où est Java
À propos des fonctionnalités Java
À propos des threads Java
Interface [Java]
À propos de la classe Java
À propos des tableaux Java
À propos de l'héritage Java
À propos de l'interface, interface java
À propos de Java Var
À propos de Java Literal
À propos des commandes Java
À propos de la sortie du journal Java
À propos de l'interface fonctionnelle Java
Java, à propos d'un tableau à deux dimensions
À propos de la division de classe (Java)
À propos de la classe Java StringBuilder
[Java] À propos de la classe Singleton
À propos de la liaison de méthode Java
[Java] À propos des classes anonymes
A propos des méthodes de fractionnement (Java)
[Java Silver] À propos de l'initialisation
A propos de la liste des baies Java
À propos du polymorphisme Java Super ()
À propos de l'héritage (Java Silver)
À propos de la classe Java String
À propos des modificateurs d'accès Java
À propos des expressions Java lambda
À propos des points d'entrée Java
Prise en charge de Java 10 Docker
Résumé personnel sur Java
Tout sur la programmation Java
À propos de la classe abstraite de Java
Remarques sur Java GC
À propos des instances Java
Ce que j'ai recherché sur Java 6
[Gradle] À propos des tâches du plug-in Java
À propos des instructions de déclaration de variable Java
Ce que j'ai recherché sur Java 9
[Java] À propos de la gestion des exceptions try-catch
À propos des types de chargeur de classe Java
[Java Silver] À propos de la méthode equals
[Java] À propos de String et StringBuilder
Ce que j'ai recherché sur Java 7
À propos des directives de codage Java d'Alibaba
Méthode de classe variable de classe Java
À propos du package Java et de l'importation
À propos de la classe abstraite Java
[Android / Java] En savoir plus sur DataBinding
Ce que j'ai recherché sur Java 5
À propos des méthodes Java statiques et non statiques
Que diriez-vous de TECH ACADEMY ?? [Cours Java]
[Introduction à Java] À propos des expressions lambda
À propos de Biocontainers fastqc et Java
À propos de Lambda, Stream, LocalDate de Java8