Convertir Map<String,Object> pour Map<String,String>
Comment puis-je convertir Map<String,Object>
à Map<String,String>
?
Cela ne fonctionne pas:
Map<String,Object> map = new HashMap<String,Object>(); //Object is containing String
Map<String,String> newMap =new HashMap<String,String>(map);
- Qu'essayez-vous de faire?
- Est l'Objet que vous êtes de passage est une Chaîne de caractères?
- Qu'attendez-vous/voulez-vous arriver dans ce cas: ` Map<String, Object> map = new Map<String, Object>() de la carte.put("key", new Integer(42));`
- Itérer la map1 (carte) à côté de l'itération cast de l'Objet à une chaîne et de créer un newMap avec oldString et nouvellement coulé Chaîne
- Depuis pas tous les
Object
est unString
, vous pouvez l'appelertoString()
sur chaque valeur de laMap
. Mais est-ce que vous bean par "convertir"?
Vous devez vous connecter pour publier un commentaire.
Si votre
Objects
sont à base deStrings
seul, alors vous pouvez le faire comme ceci:Si tous les
Objects
ne sont pasString
ensuite, vous pouvez remplacer(String) entry.getValue()
enentry.getValue().toString()
.ClassCastException
être levée, au lieu d'exécuter une vérification avant si levalue
est unString
.String.valueOf
pour éviter NullPointerExceptionMaintenant que nous avons Java 8/flux, nous pouvons ajouter une autre réponse possible à la liste:
En supposant que chacune des valeurs réellement sont
String
objets, le cast deString
devrait être en sécurité. Sinon, un autre mécanisme pour la cartographie des Objets pour les Chaînes de caractères peuvent être utilisés.e.getValue().toString()
pourquoi cast explicite?Types génériques est un moment de la compilation, de l'abstraction. Au moment de l'exécution de toutes les cartes ont le même type de
Map<Object, Object>
. Donc, si vous êtes sûr que les valeurs sont des chaînes de caractères, vous pouvez tricher sur compilateur java:La copie de clés et de valeurs à partir d'une collection à l'autre est redondante. Mais cette approche n'est toujours pas bon, parce qu'il viole les génériques de sécurité de type. Peut-être vous devriez revoir votre code afin d'éviter de telles choses.
Il y a deux façons de le faire. L'un est très simple, mais dangereux:
L'autre sens n'a pas d'avertissements du compilateur et assure la sécurité de type à l'exécution, qui est plus robuste. (Après tout, vous ne pouvez pas garantir l'origine de la carte ne contient que des valeurs de Chaîne, sinon pourquoi ne serait-il pas
Map<String, String>
en premier lieu?)Pas possible.
Un peu contre-intuitif.
Aller pour la création d'une nouvelle carte et de vérification avec
instance of with String
Comme vous le moulage de l'Objet à la Chaîne, je vous recommande de les attraper et de rapport (d'une certaine façon, ici, j'ai juste l'impression d'un message, ce qui est généralement mauvais) l'exception.
Alors que vous pouvez le faire avec brute de coulée et supprimé les avertissements
c'est vraiment manquant le point de l'ensemble. 🙂
Une tentative de convertir un étroit type générique à un ensemble plus large de type générique signifie que vous utilisez le mauvais type dans la première place.
Comme une analogie: Imaginez que vous avez un programme qui ne volumous de traitement de texte. Imaginez que vous faites de la première moitié du traitement à l'aide d'
Objects
(!!) et ensuite décider de faire la deuxième moitié de l'correct-taper comme unString
, de sorte que vous réduisez en fonte à partir deObject
àString
. Heureusement, vous pouvez faire c'est de java (dans ce cas), mais il est juste de masquer le fait que vous êtes à l'aide de la faiblesse de frappe dans la première moitié. Une mauvaise pratique, aucun argument.Pas de différence ici (juste plus difficile de cast). Vous devriez toujours utiliser le typage fort. Au minimum l'utilisation de certains type de base - puis les génériques des caractères génériques peuvent être utilisés ("? s'étend BaseType" ou "? super BaseType") pour donner le type-la compatibilité et automatique de la coulée. Mieux encore, utiliser le bon type connu. N'utilisez jamais d'Objet, sauf si vous avez 100% généralisées code qui peut vraiment être utilisé avec n'importe quel type.
Espère que ça aide! 🙂 🙂
Remarque: Le générique de taper fort et de conversion de type existent uniquement dans .le code java. Après la compilation .la classe qui nous a laissé brut types (Carte et HashMap) avec aucun des paramètres de type générique plus automatique type coulée de clés et de valeurs. Mais il contribue grandement à cause de la .java code lui-même est fortement typé et concis.
Suivantes pour transformer vos entrées existantes.
Où, comme
transforme seulement de nouvelles entrées dans votre carte
D'excellentes solutions ici, juste une option de plus que la prise en compte de la manipulation de
null
valeurs: