Java 8 Flux + Carte + ForEach + Recueillir
Je lis les valeurs d'un fichier et j'obtiens une liste. comme ci-dessous -
List<String> fields = Utils.readFile("myText.txt", true);
Une fois que j'ai obtenu ce List<String>
je veux parcourir cette liste et passer chaque valeur à une fonction qui utilise cette valeur, interroge dans DB et prépare un List<MyCustomObject>
et renvoie le même.
L'implémentation en Java 7 est assez facile mais je ne parviens pas à l'obtenir en Java 8 en utilisant les opérations Stream + Map/forEach + Collect.
J'ai essayé ce qui suit -
Utils.readFile("myText-"+".txt", true)
.stream()
.map(str -> getListOfCustomObjForEachStr(str, pstmt))
.collect(Collectors.toList());
Mais il renvoie un List<List<MyCustomObject>>
au lieu de merged List<MyCustomObject>
La méthode GetListOfCustomObjForEachStr() renvoie une liste pour chaque str d'entrée passé dans le code ci-dessus. Et j'ai besoin d'une liste fusionnée
Quelqu'un peut-il me guider ce qui peut être fait ici pour obtenir une liste fusionnée? (Je suis nouveau sur Java 8 donc cela peut sembler une question stupide mais toute aide est appréciée)
Modifier 1 Obtenu ceci implémenté comme ci-dessous en utilisant FlatMap - Veuillez suggérer si une autre meilleure façon de le faire. J'espère que cela aidera quelqu'un quelque part un jour:) Gardez partager.
List<MyCustomObjects> = Utils.readFile("myText-"+".txt", true)
.stream()
.map(str -> getListOfCustomObjForEachStr(str, pstmt))
.flatMap(Collection::stream)
.collect(Collectors.toList());
1 answers
L'utilisation de flatMap
est le moyen canonique d'obtenir une liste plate. Vous pouvez utiliser une seule étape au lieu de map
+flatMap
:
List<MyCustomObjects> list = Utils.readFile("myText-"+".txt", true)
.stream()
.flatMap(str -> getListOfCustomObjForEachStr(str, pstmt).stream())
.collect(Collectors.toList());
Vous pouvez penser à une alternative à getListOfCustomObjForEachStr
retour d'un Stream
, en premier lieu. De plus, pas l'existence de Files.lines
, qui renvoie un flux de chaînes de lignes sans remplir d'abord un List
temporaire.
, Dans ce cas précis, il existe une alternative. Considérant que .collect(Collectors.toList())
est équivalent à .collect(ArrayList::new, List::add, List::addAll)
1, vous utilisez également
List<MyCustomObjects> list = Utils.readFile("myText-"+".txt", true)
.stream()
.map(str -> getListOfCustomObjForEachStr(str, pstmt))
.collect(ArrayList::new, List::addAll, List::addAll);
Remplacer add
par addAll
, ce qui est déjà suffisant pour ajouter tous les sous-List<MyCustomObjects>
s de la suite List<MyCustomObjects>
.
1 C'est ainsi que toList()
fonctionne maintenant, mais comme il n'est pas spécifié de le faire, il peut être différent dans d'autres versions