J'ai deux cartes:
Map<String, Integer> x; Map<Integer, String> y;
Ce que je veux, c'est une nouvelle carte, Map
où cette nouvelle carte a les clés de chaîne en x mappez à la valeur de chaîne en y, où ces nouvelles paires de clés conservent le même mappage que String -> Integer -> String.
Est-ce que quelqu'un connaît un moyen de faire cela en java 8 en utilisant des flux?
3 Réponses :
x.entrySet() .stream() .collect(Collectors.toMap( e -> e.getKey(), e -> y.get(e.getValue()) )); But this can fail for numerous reasons, which you could think how to solve: like what would happen is there is a value in x, but such a key is not present in y; or if there are multiple same values in x? All of these could be solved if you make your question a bit more clear.
Une implémentation simple utilisant le premier jeu d'entrées de la carte peut ressembler à ceci:
Map<String, String> result = x.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, e -> y.get(e.getValue())));
Vous devrez parcourir l'ensemble d'entrées des entrées de x
et mettre la valeur de y
correspondant aux valeurs de x
.
Il y a toujours une chance que la valeur ne soit pas présente dans y
et qu'elle renvoie null donc
dans de tels cas, vous pouvez utiliser par défaut une valeur en utilisant Optional.ofNullable ()
sur la méthode get ()
de y
et gérer la valeur par défaut plus tard. Mais c'est toujours une approche risquée étant donné qu'il y a des chances que la taille de x
et y
ne soit pas la même.
Exemple :
Map< String, Integer > x = new HashMap<>( ); x.put( "a", 1 ); x.put( "b", 2 ); x.put( "c", 3 ); Map< Integer, String > y = new HashMap<>( ); y.put( 1, "a" ); y.put( 2, "b" ); y.put( 4, "c ); Map< String, String > z = new HashMap<>( ); if ( x.size( ) == y.size( ) ) { z = x.entrySet( ) .stream( ) .collect( Collectors.toMap( Map.Entry::getKey, entry -> Optional.ofNullable( y.get( entry.getValue( ) ) ).orElse( "N/A" ) ) ); } System.out.println( z ); //prints {a=a, b=b, c=N/A}