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}