3 votes

Comment diffuser une liste avec une liste intérieure

J'ai besoin d'aide avec les flux en Java 8. J'ai une liste de noms avec une liste interne de nombres entiers comme ce code et cet exemple :

public class Test {

    private String name;    
    private List<Integer> nrList;    

    public Test() {
    }

    public Test(String name, List<Integer> nrList) {

        this.name = name;
        this.nrList = nrList;        
    }

    public String getName() {
        return name;
    }

    public List<Integer> getNrList() {
        return nrList;
    }
}

Par exemple, je veux ceci :

1. Alex 10 15
2. Steve 5
3. Bob 3 16 20

pour se retrouver dans une liste redondante de noms comme celui-ci :

1. Alex 10
2. Alex 15
3. Steve 5
4. Bob 3
5. Bob 16
6. Bob 20

Comment puis-je gérer cela avec les flux Java 8 ?

1voto

Eran Points 35360

Vous pouvez utiliser flatMap pour générer un élément unique pour chaque élément des listes internes.

Par exemple, si vous voulez que la sortie soit un fichier de type List<String> où chaque String est une concaténation d'un nom et d'un des entiers correspondants :

List<Test> input = ...
List<String> output = input.stream()
                           .flatMap(t->t.getNrList().stream().map(i->t.getName() + " " + i))
                           .collect(Collectors.toList());

Bien sûr, vous pouvez générer un List de n'importe quel type d'élément en tant que sortie (par exemple, une List<Test> où la liste interne de chaque Test n'a qu'un seul élément), en fonction de vos besoins. Il vous suffit de modifier la fonction de mappage transmise à map pour générer l'instance requise.

1voto

mlecz Points 572

Si je comprends bien, ce que vous voulez faire c'est :

    List<Test> lt = new ArrayList<>();
    lt.add(new Test("1", Arrays.asList(1, 2, 3)));
    lt.add(new Test("2", Arrays.asList(2, 3, 4)));

    List<Test> lt2 =
            lt.stream()
                    .map(test ->
                            test.getNrList().stream()
                                    .map(number -> new Test(test.getName(), Arrays.asList(number)))
                                    .collect(Collectors.toList()))
                    .flatMap(l -> l.stream())
                    .collect(Collectors.toList());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X