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 ...)
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