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());
Author: Swapnil Jaju, 2017-01-16

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

 8
Author: Holger, 2017-01-16 10:12:47