Convertir la carte en carte

Comment convertir Map en Map ?

Cela ne fonctionne pas:

 Map map = new HashMap(); //Object is containing Ssortingng Map newMap =new HashMap(map); 

Si vos Objects ne contiennent que des Ssortingngs , vous pouvez le faire comme ceci:

 Map map = new HashMap(); //Object is containing Ssortingng Map newMap =new HashMap(); for (Map.Entry entry : map.entrySet()) { if(entry.getValue() instanceof Ssortingng){ newMap.put(entry.getKey(), (Ssortingng) entry.getValue()); } } 

Si tous les Objects ne sont pas de type Ssortingng vous pouvez remplacer (Ssortingng) entry.getValue() dans entry.getValue().toSsortingng() .

Maintenant que nous avons les stream Java 8 /, nous pouvons append une autre réponse possible à la liste:

En supposant que chacune des valeurs est réellement un object Ssortingng , la conversion en Ssortingng doit être sûre. Sinon, un autre mécanisme pour mapper les objects aux chaînes peut être utilisé.

 Map map = new HashMap<>(); Map newMap = map.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, e -> (Ssortingng)e.getValue())); 

Les types génériques sont une abstraction de la compilation. Au moment de l’exécution, toutes les cartes auront le même type: Map . Donc, si vous êtes sûr que les valeurs sont des chaînes, vous pouvez sortingcher sur le compilateur java:

 Map m1 = new HashMap(); Map m2 = (Map) m1; 

La copie de clés et de valeurs d’une collection à une autre est redondante. Mais cette approche n’est toujours pas bonne car elle viole la sécurité des génériques. Peut-être devriez-vous reconsidérer votre code pour éviter de telles choses.

Il y a deux façons de faire ça. L’un est très simple mais dangereux:

 Map map = new HashMap(); Map newMap = new HashMap((Map)map); // unchecked warning 

L’autre méthode ne comporte aucun avertissement du compilateur et garantit la sécurité du type lors de l’exécution, qui est plus robuste. (Après tout, vous ne pouvez pas garantir que la carte d’origine ne contient que des valeurs de type Ssortingng, sinon, pourquoi ne serait-ce pas Map ?)

 Map map = new HashMap(); Map newMap = new HashMap(); @SuppressWarnings("unchecked") Map intermediate = (Map)Collections.checkedMap(newMap, Ssortingng.class, Ssortingng.class); intermediate.putAll(map); 

Comme vous lancez de Object en Ssortingng, je vous recommande d’attraper et de signaler (d’une certaine manière, j’imprime simplement un message, ce qui est généralement mauvais) l’exception.

  Map map = new HashMap(); //Object is containing Ssortingng Map newMap =new HashMap(); for (Map.Entry entry : map.entrySet()) { try{ newMap.put(entry.getKey(), (Ssortingng) entry.getValue()); } catch(ClassCastException e){ System.out.println("ERROR: "+entry.getKey()+" -> "+entry.getValue()+ " not added, as "+entry.getValue()+" is not a Ssortingng"); } } 

Pas possible.

C’est un peu contre-intuitif.

Vous rencontrez le “Pomme est un fruit” mais “Chaque fruit n’est pas une pomme”

Aller pour créer une nouvelle carte et vérifier avec instance of with Ssortingng

Alors que vous pouvez le faire avec le moulage brutal et les avertissements supprimés

 Map map = new HashMap(); // Two casts in a row. Note no "new"! @SuppressWarnings("unchecked") Map newMap = (HashMap)(Map)map; 

c’est vraiment tout ce qui manque. 🙂

Une tentative de convertir un type générique étroit en un type générique plus large signifie que vous utilisez le mauvais type en premier lieu.

Par analogie: Imaginez que vous ayez un programme de traitement de texte volumineux. Imaginez que vous fassiez la première moitié du traitement en utilisant Objects (!!) et que vous décidiez ensuite de faire la seconde moitié avec une saisie correcte en tant que Ssortingng , afin de réduire la conversion de Object en Ssortingng . Heureusement, vous pouvez le faire java (facilement dans ce cas) – mais il suffit de masquer le fait que vous utilisez un typage faible au premier semestre. Mauvaise pratique, pas d’argument.

Aucune différence ici (juste plus difficile à lancer). Vous devez toujours utiliser un typage fort. Au minimum, utilisez un type de base – alors les génériques génériques peuvent être utilisés (“? Extend BaseType” ou “? Super BaseType”) pour assurer la compatibilité de type et la diffusion automatique. Mieux encore, utilisez le type connu correct. N’utilisez jamais Object à moins d’avoir du code généralisé à 100% pouvant être utilisé avec n’importe quel type.

J’espère que cela pourra aider! 🙂 🙂


Remarque: le typage fort et le transtypage génériques n’existeront que dans le code .java. Après la compilation en classe .class, il nous rest des types bruts (Map et HashMap) sans parameters de type génériques, plus la conversion automatique des clés et des valeurs. Mais cela aide grandement car le code .java lui-même est fortement typé et concis.

Ce qui suit transformera vos entrées existantes.

 TransformedMap.decorateTransform(params, keyTransformer, valueTransformer) 

Tandis que

 MapUtils.transformedMap(java.util.Map map, keyTransformer, valueTransformer) 

ne transforme que les nouvelles entrées dans votre carte

 private Map convertAtsortingbutes(final Map atsortingbutes) { final Map result = new HashMap(); for (final Map.Entry entry : atsortingbutes.entrySet()) { result.put(entry.getKey(), Ssortingng.valueOf(entry.getValue())); } return result; } 

De grandes solutions ici, juste une option supplémentaire prenant en compte le traitement des valeurs null :

 Map map = new HashMap<>(); Map ssortingngifiedMap = map.entrySet().stream() .filter(m -> m.getKey() != null && m.getValue() !=null) .collect(Collectors.toMap(Map.Entry::getKey, e -> (Ssortingng)e.getValue()));