1
votes

Java 8: Obtenez une nouvelle carte X-> Z à partir de deux autres cartes X-> Y et Y-> Z

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?


0 commentaires

3 Réponses :


2
votes
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. 

0 commentaires

2
votes

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())));


0 commentaires

0
votes

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}


0 commentaires