Traitement des listes à comprendre avec des images - java8 stream / javaslang-

J'entends souvent "j'ai essayé le stream avec java8, mais je n'y suis pas habitué" ou "je ne peux pas le faire si j'essaye de faire quelque chose d'un peu difficile", donc je vais le résumer.

Il semble que si vous saisissez le type, vous pouvez comprendre 80%, alors je vais essayer d'en faire une image.

~~ Au fait, l'article est long, mais il suffit de lire le premier titre [histoire principale -)! ~~

C'est trop long pour réfléchir calmement, alors je l'ai divisé.

[Main story --java8 stream]: filtrer, cartographier, réduire

Maintenons les trois mains de base.

Vous n'êtes peut-être pas familier avec reduction, mais c'est un modèleMapReduce préconisé par Google, donc vous pouvez parler avec map. -> wiki

Regardons cela en utilisant l'exemple ci-dessous.

/*
 *Il y a le journal suivant
 *Étiquette ou étiquette:Sortie ligne par ligne au format millisec
 *
 *Trouvez la somme des millisecondes
 */
List<String> lines = Arrays.asList(
    "application-boot", "access-dispatch:10", "dispatched", "authentication:30", "database-access:45", "response-creation:15", "access-logging"
);

L'important est le type, alors n'ayez pas peur des génériques et vérifiez-le.

Ensuite, beaucoup de ces images sortiront.

legend.png

ʻA-> B fest écrit en code java commeB f (a); et ʻA et B sont String et ʻOptional . Contient un type spécifique tel que `. En d'autres termes, les génériques.

filter La définition de «filtre» est la suivante.

Stream<T> filter(Predicate<? super T> predicate);

Oubliez Predicate <T> que l'argument est T et la valeur de retour est bool, et? Super T.

Prenons la notation de type Predicate <T> comme T to bool et écrivons (T-> bool). Au fait, simplifions également les génériques.

Stream<T> filter((T -> bool) f);

Pour utiliser filter pour créer des lignes uniquement des lignes avec: `, vous pouvez écrire:

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]

Si vous écrivez la définition comme T-> bool, l'implémentation line-> line.contains (": ") a la même apparence. (Dans ce sujet, «T» est spécifiquement «String»)

Est-ce comme ça lorsqu'il est dessiné dans une image?

filter.png

filtre signifie que le ** type ** ne change pas, mais que le ** nombre ** change.

map La définition de «map» est la suivante.

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

Ceci est également simplifié de la même manière.

Stream<R> map((T -> R) f);

Utiliser map pour changer la ligne de label: millisec en ʻInteger peut être écrit après filter` comme suit.

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]
        .map(line -> Integer.valueOf(line.split(":")[1]))    // [10, 30, 45, 15]

Ici aussi, l'implémentation a la même forme que la définition «T-> R». (Dans ce sujet, R est spécifiquement ʻInteger, donc ce serait bien si T-> R ressemble à String-> Integer`)

Est-ce comme ça lorsqu'il est dessiné dans une image?

map.png

map signifie que le ** nombre ** ne change pas, mais que le ** type ** change.

reduce Il existe trois définitions de «réduire» dans le flux java8, mais c'est ce que je vais utiliser maintenant.

T reduce(T identity, BinaryOperator<T> accumulator);

BinaryOperator <T> est un peu inconnu, mais cela signifie "deux arguments sont T et la valeur de retour est" T` ". Simplifions cela sans avoir peur.

T reduce(T t, ((T, T) -> T) f);

«réduire» est généralement appelé «convolution», et c'est un processus d'accumulation des résultats dans l'ordre à partir du haut de la liste.

En utilisant reduction pour faire de la ligne ʻInteger la somme de ʻInteger peut être écrite dans la suite de map comme suit.

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]
        .map(line -> Integer.valueOf(line.split(":")[1]))    // [10, 30, 45, 15]
        .reduce(0, (acc, n) -> acc + n)                      // 100

Il y a quelques parenthèses dans la définition, mais cela devrait être un peu plus facile à comprendre car T, (T, T) -> T et 0, (acc, n) -> ... ont la même forme.

Est-ce comme ça lorsqu'il est dessiné dans une image?

reduce with zero a.png

réduire est un processus dans lequel les ** éléments de liste ** deviennent ** un seul résultat **.

Résumé

C'est clair!

 *Trouvez la somme des millisecondes

Est

// (Republier)

lines.stream()
        .filter(line -> line.contains(":"))                  // ["access-dispatch:10", "authentication:30", "database-access:45", "response-creation:15"]
        .map(line -> Integer.valueOf(line.split(":")[1]))    // [10, 30, 45, 15]
        .reduce(0, (acc, n) -> acc + n)                      // 100

Je l'ai résolu avec.

Pour le moment, je posterai la photo complète.

resolve.png

fin

Tous les extras à partir de maintenant ont été séparés dans les articles suivants.

Traitement de la liste compris par les images --java8 stream / javaslang --bonus

Rafraîchissant.

Recommended Posts

Traitement des listes à comprendre avec des images - java8 stream / javaslang-
Traitement des listes à comprendre avec des images --java8 stream / javaslang --bonus
[java8] Pour comprendre l'API Stream
Conversion de liste Java8 avec Stream map
[Java] Traitement de flux
Exemple de code pour convertir List en List <String> dans Java Stream
Java pour jouer avec Function
[Java] Stream API - Traitement de l'arrêt du flux
[Java] Stream API - Traitement intermédiaire de flux
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
[Java] Introduction à l'API Stream
Thread Java pour comprendre vaguement
Comment gérer les exceptions froidement avec Java 8 Stream ou en option
Je veux faire une liste avec kotlin et java!
Convertir un tableau bidimensionnel au format csv avec l'API Java 8 Stream
[Java 8] Suppression en double (et vérification en double) avec Stream
Java pour apprendre avec les ramen [Partie 1]
[Java] Points à noter avec Arrays.asList ()
[Introduction à Java] À propos de l'API Stream
Déléguer certains traitements Java à JavaScript
Osez défier Kaggle avec Java (1)
[Java] Vérification de l'existence des éléments avec Stream
[Traitement × Java] Comment utiliser les variables
J'ai essayé d'interagir avec Java
[Java] Convertir 1 en N liste en carte
[Java] Comment utiliser List [ArrayList]
Traitement serveur avec Java (Introduction partie 1)
Traitement de flux d'inversion de liste Java étonnamment profond
Flux de traitement de base de Java Stream
Java, des tableaux pour débuter avec les débutants
Java 8 ~ Stream API ~ pour commencer maintenant
[Java] Conversion d'un tableau à une liste
[Traitement × Java] Comment utiliser les tableaux
Liste de conversion mutuelle de tableau / liste / flux Java
[Java] [ibatis] Comment obtenir des enregistrements de relation 1 à N avec List <Map <>>
Je souhaite effectuer un traitement Group By avec Stream (group-by-count, group-by-sum, group-by-max)
Java8 / 9 Beginners: Streaming API addiction points et comment les gérer
[Java] Obtenir des éléments List / Map avec Iterator
Traitement des données à l'aide de l'API de flux de Java 8
Comment compiler Java avec VsCode & Ant
Référence Java à comprendre dans la figure
[Java] Résumez comment comparer avec la méthode equals
[Java] Comment ajouter des données à la liste (add, addAll)
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
[Traitement × Java] Comment utiliser la boucle
Remplacez List <Optional <T >> par Optional <List <T >> en Java
[Java] Map # merge est difficile à comprendre.
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
Facile à parcourir avec les expressions régulières Java
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
[Java] Différentes méthodes pour acquérir la valeur stockée dans List par traitement itératif
[Java] Comprendre la différence entre List et Set
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
[Java] De deux listes à une liste de tableaux
J'ai essayé de faire une authentification de base avec Java
Introduction aux algorithmes avec java --Search (bit full search)
Déployez des applications Web Java sur Azure avec maven
Course d'obstacles facile avec traitement pour Java