6 votes

création de cartes imbriquées avec des propriétés imbriquées à partir de listes, de flux, de Java 8

J'ai posé cette question stream créant une liste de liste (liste imbriquée) en utilisant forEach, Java 8

class EntityCompositeId {
    private Long firstId;
    private Long secondId;
    // getter & setter...
}

class EntityComposite {
    private EntityCompositeId id;
    private String first;
    private String second;
    // getter & setter...
}

List<EntityComposite> listEntityComposite = ....
Supose this content

1, 1, "firstA", "secondBirdOne"
1, 2, "firstA", "secondBirdTwo"
1, 3, "firstA", "secondBirdThree"

2, 1, "firstB", "secondCatOne"
2, 2, "firstB", "secondCatTwo"
2, 3, "firstB", "secondCatThree"

3, 1, "firstC", "secondDogOne"
3, 2, "firstC", "secondDogTwo"
3, 3, "firstC", "secondDogThree"

Map<Long, Map<Long, String>> listOfLists = new HashMap<>();

Maintenant en utilisant stream je veux remplir comme :

 1 -> {1 ->"secondBirdOne", 2 -> "secondBirdTwo", 3 -> "secondBirdThree"}
 2 -> {1 ->"secondCatOne", 2 -> "secondCatTwo", 3 -> "secondCatThree"}
 3 -> {1 ->"secondDogOne", 2 -> "secondDogTwo", 3 -> "secondDogThree"}

Mon code NON fonctionnel était :

    Map<Long, Map<Long, String>> listaMunDepa = listEntityComposite.stream()
        .collect(Collectors.groupingBy(
            e -> e.getId().getFirstId(),
            Collectors.toMap(f -> f.getId().getSecondId(), Function.identity()))
    );

deuxième essai

    Map<Long, Map<Long, String>> listaMunDepa = listEntityComposite.stream()
        .collect(Collectors.groupingBy(
            e -> e.getId().getFirstId(),
            Collectors.groupingBy(EntityComposite::getId::getSecondId, EntityComposite::getSecond)) // How change this line
    );

5voto

Aomine Points 42709

Vous êtes vraiment proche au lieu de passer Function.identity vous devriez passer EntityComposite::getSecond

listEntityComposite.stream()
           .collect(groupingBy(e -> e.getId().getFirstId(),
                  toMap(f -> f.getId().getSecondId(), EntityComposite::getSecond)));

parce que vous avez fourni Function.identity le résultat était Map<Long, Map<Long, EntityComposite>> Ainsi, comme indiqué ci-dessus, il vous suffit d'extraire le fichier getSecondId pour le valueMapper fournie à toMap ce qui donne un Map<Long, Map<Long, String>> .

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