[JAVA] Vers la compréhension de la carte et de la flatmap dans Stream (1)

question

De la liste de deux ʻInteger` Générez une liste de paires qui sont une combinaison de tous les éléments les uns des autres.

ex.) [1,2,3], [5,6] -> [(1,5),(1,6),(2,5),(2,6),(3,5),(3.6)]

trial1 Peut-être que je peux aller avec une carte.

List<Integer> ints1 = Arrays.asList(1,2,3);
List<Integer> ints2 = Arrays.asList(5,6);
ints1.stream()
     .map( i -> ints2.stream().map( j -> Pair.of(i,j)))
     .collect(toList()); 

Pas bien. List <Stream <Pair <Integer, Integer >> est retourné.

En premier lieu ... La fonction Stream.map prend le type Fonction <? Super T,? Étend R> comme argument et renvoie <R> Stream <R>.

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

Ainsi, la carte imbriquée est Renvoie Stream <Pair <Integer, Integer >> et La carte d'origine qui a reçu la valeur de retour Il retournera Stream <Stream <Pair <Integer, Integer >>>.

Et par l'opération de terminaison List <Stream <Pair <Integer, Integer >> est finalement retourné. (L'avenir dépendra de ce que fait l'opération de terminaison ...)

Si flatMap

En utilisant flatMap Remplacez chaque valeur de Stream par un autre Stream, Tous les flux générés seront regroupés en un seul flux. ref. Java8 in Action

Par définition Passé comme argument à flatMap Le deuxième argument de Fonction <? Super T,? Etend Stream <? Etend R >> mappeur est Il s'agit de ? Extend Stream <? Extend R> La valeur de retour est Il est de type R <R> Stream <R> qui constitue le Stream du deuxième argument de Function.

Stream flatMap(Function<? super T,? extends Stream<? extends R>> mapper) ref. flatMap

Sur la base de ce qui précède, le code est le suivant.

ints1.stream()
     .flatMap( i -> ints2.stream().map( j -> Pair.of(i,j)))
     .collect(toList());

flatMap( i -> ints2.stream().map( j -> Pair.of(i,j))) Le type renvoyé par Avec Stream <Pair <Integer, Intege >>, L'opération de terminaison renvoie List <Pair <Integer, Integer >>.

En utilisant flatMap On a l'impression que cela rend le Stream imbriqué dans trial1 bien ^^; (Explication divers)

Recommended Posts

Vers la compréhension de la carte et de la flatmap dans Stream (1)
Différence entre Stream map et flatMap
map, compactMap et flatMap
Comprendre equals et hashCode en Java
Examinons la signification de "stream" et "collect" dans l'API Stream de Java.
Résumé des hachages et symboles dans Ruby
[Ruby] Distinction et utilisation des boucles dans Ruby
Discrimination d'énum dans Java 7 et supérieur
Essayez de réaliser une correspondance de modèle de type Option de type Scala et une carte, flatMap en Java
[Comprendre] Différence entre le hachage et le tableau dans Ruby
[Rails] Classement et pagination par J'aime
Résumé des commandes fréquemment utilisées dans Rails et Docker
Utilisation de polices japonaises et de caractères étrangers dans Jasper Report
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
Convivialité de la classe de date et d'heure dans chaque langue
Utilisation correcte de la classe abstraite et de l'interface en Java
Traitement de la date et de l'heure en Ruby. Utilisez correctement la date et l'heure.