API Java Stream en 5 minutes

Cet article est destiné aux personnes qui ne peuvent pas lire l'API Java Stream.

Recommandé pour les personnes suivantes

En premier

L'API Java Stream n'a rien à voir avec les classes d'E / S telles que InputStream et OutputStream. C'est un mécanisme permettant de traiter un objet de collection tel que List, Set ou un élément bouclable tel qu'un tableau une seule fois dans la boucle.

Les deux points suivants sont souvent utilisés à l'aide de l'API Stream.

--Convertir une entité (méthode de la carte)

Voici le code Java.

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTest {
    public static void main(String[] args) {
        List<String> csvList = new ArrayList<>();
        csvList.add("Naoki Tanaka,MAN");
        csvList.add("Kazuki Kitamura,MAN");
        csvList.add("Shizuka Kato,WOMAN");
        csvList.add("Sœur Ono,UNKNOWN");
        // 1.Convertissez une entité.(map)
        List<Person> persons = csvList.stream().map(Person::convertPersonFromCSV).collect(Collectors.toList());

        // 2.Filtrer les entités.(filter)
        List<Person> mens = persons.stream().filter(p -> p.getGender() == Gender.MAN).collect(Collectors.toList());

        System.out.println("Print all persons");
        persons.forEach(System.out::println);

        System.out.println("Print mens only");
        mens.forEach(p -> System.out.println(p.getName()));
    }

    enum Gender {
        MAN,
        WOMAN,
        UNKNOWN;
    }

    static class Person {
        private String name;
        private Gender gender;

        public Person(String name, Gender gender) {
            this.name = name;
            this.gender = gender;
        }

        @Override
        public String toString() {
            return String.format("My name is %s . \r\nMy gender is %s.", name, gender);
        }

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

        public Gender getGender() {
            return this.gender;
        }

        public static Person convertPersonFromCSV(String csv) {
            String[] csvStrings = csv.split(",");
            if (csvStrings.length != 2) throw new IllegalArgumentException("csv is illegal format.");
            return new Person(csvStrings[0], Gender.valueOf(csvStrings[1]));
        }
    }
}

Regardons ce qui précède dans l'ordre

Convertir une entité

Utilisez la méthode map lors de la conversion d'une entité. Utilisez la méthode de carte pour convertir et la méthode de collecte pour convertir à nouveau Stream en type Collection. </ b>

Il existe trois manières principales d'écrire:

csvList.stream().map(Person::convertPersonFromCSV).collect(Collectors.toList());
csvList.stream().map(csv -> Person.convertPersonFromCSV(csv)).collect(Collectors.toList());
csvList.stream().map(csv -> {
                         Person person = Person.convertPersonFromCSV(csv);
                         return person;
                     }).collect(Collectors.toList());

Tout est pareil, récupérez la String qui est un élément de csvList, J'exécute une méthode qui le convertit en objet Person et le renvoie.

  • Le premier est comment écrire en omettant l'argument csv
  • La seconde est de savoir comment écrire sur une ligne, en omettant la méthode de retour ――Le troisième est de savoir comment écrire sans rien omettre

En utilisant Stream, j'ai pu convertir List en List en une seule ligne (une ligne). </ b> L'un des avantages de l'utilisation de Stream est que vous pouvez réduire la quantité de code que vous écrivez.

Si vous n'avez pas le temps, veuillez ignorer ce qui suit.

  • csvList.stream()
  • Obtenez un objet Stream.
  • map(Person::convertPersonFromCSV) --String, qui est l'interface générique de csvList, est donnée comme argument de la méthode map.
  • Appelez la méthode de conversion d'entité de la classe Person pour convertir l'entité et renvoyer la classe d'entité.
  • À l'aide de la méthode qui implémente l'interface Function, la classe String est convertie en classe Person et renvoyée.
  • collect(Collectors.toList()) --Recueillir les personnes converties. --Ajouter à la classe List avec Collectors.toList ().
  • Vous pouvez également le convertir en Set ou Map avec Collectors.toXXX (). Dans le cas de toMap, il est nécessaire de décrire deux fonctions qui renvoient la clé et la valeur.
  • L'ordre de traitement de la méthode est une image de répétition du processus de "conversion avec carte et stockage des objets traités avec Stream avec collecte dans la liste".

Filtrer la collection

Vous pouvez créer un nouvel objet de collection en excluant certains éléments de la collection. </ b> Utilisez la méthode de filtrage pour décrire l'objet cible que vous souhaitez conserver.

persons.stream().filter(p -> p.getGender() == Gender.MAN).collect(Collectors.toList());

En utilisant Stream, j'ai pu créer une nouvelle collection avec uniquement des hommes extraits de List dans une seule doublure. </ b>

  • filter(p -> p.getGender() == Gender.MAN) --Prend Person comme argument et renvoie un booléen.

Autres choses que vous faites souvent avec l'API Stream

  • findAny
  • En combinaison avec le filtre, détecte si un élément particulier est présent.
  • sum --Calculer le nombre total de collections en combinaison avec mapToInt.
  • reduce --Combinez les éléments de la collection en un seul objet.

Recommended Posts