IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

stream collector merge maps


Sujet :

Langage Java

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 130
    Points
    9 130
    Par défaut stream collector merge maps
    Bonjour

    j'ai une List<Map<String,List<String>>> et je cherche à obtenir Map<String,List<String>>

    [{"a":["X","Y"]},{"a":["X","Z"],"b":["H"]}] =>{"a":["X","Y","Z"],"b":["H"]}
    J'ai essayé des truc avec stream mais je n'obtiens pas le bon résultat.

    J'ai presque le résultat
    {"a":[["X","Y"],["X","Z"]],"b":[["H"]]} mais le type retourné est Map<Object,List<Object>> Il semble que Collectors.toList() récupère pas bien le type des éléments alors qu'ils sont tous de type String.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mapGlobal = myList.stream()
                    .flatMap(m -> m.entrySet().stream())
                    .collect(Collectors.groupingBy(Map.Entry::getKey,
                            Collectors.mapping(Map.Entry::getValue,        
                                               Collectors.toList()) //<= ICI ça retourne un List<Object> et non un List<String>
                    ));
    Merci à vous.
    A+JYT

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 130
    Points
    9 130
    Par défaut
    Bonsoir
    A force de tâtonner j'ai trouvé une solution. je ne sais pas si elle est optimale mais elle fonctionne.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package org.acme;
     
    import java.util.*;
    import java.util.Map.Entry;
    import java.util.function.BinaryOperator;
    import java.util.function.Supplier;
    import java.util.stream.Collector;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
     
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.Test;
     
    public class MergeTest {
     
        @Test
        public void testMerge() {
            Map<String, List<String>> mapGlobal = new HashMap<String, List<String>>();
            Map<String, List<String>> mapAdded = new HashMap<String, List<String>>();
     
            mapGlobal.put("a", Arrays.asList("1", "3", "5", "7"));
            mapAdded.put("b", Arrays.asList("10", "30", "50", "70"));
            mapAdded.put("a", Arrays.asList("1", "9", "15"));
     
     
            Map<String, List<String>> other = 
                Stream.of(mapGlobal, mapAdded)
                    .flatMap(m -> m.entrySet().stream())
                    .collect(Collectors.toMap(
                        Map.Entry::getKey, Map.Entry::getValue, 
                        (t,u) -> Stream.of(t, u).flatMap(List::stream).distinct().collect(Collectors.toList())
                        )
                    );
            System.out.println(other);
        }
     
    }
    Code log : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running org.acme.MergeTest
    {a=[1, 3, 5, 7, 9, 15], b=[10, 30, 50, 70]}
    [
    A+JYT

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Java 8 streams, groupingBy et mapping
    Par geforce dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 31/12/2017, 04h05
  2. Différence entre la fonction map() et reduce() de l'API stream
    Par L'aigle de Carthage dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/12/2017, 22h57
  3. [X-stream] Transformation d'une Map Java vers XML
    Par geforce dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 08/11/2016, 16h03
  4. [AJAX] [JS] Chargement de map en streaming
    Par baddark dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/02/2009, 14h00
  5. Réponses: 3
    Dernier message: 02/02/2009, 20h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo