103 votes

Conversion de java.util.Properties en HashMap<String,String>

Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>(properties);// why wrong?

java.util.Properties est une mise en œuvre de java.util.Map Et java.util.HashMap du constructeur reçoit un Map type param. Alors, pourquoi faut-il le convertir explicitement ?

100voto

fge Points 40850

Cela s'explique par le fait que Properties étend Hashtable<Object, Object> (qui, à son tour, met en œuvre Map<Object, Object> ). Vous essayez de l'introduire dans un Map<String, String> . Elle est donc incompatible.

Vous devez introduire les propriétés des chaînes une par une dans votre carte...

Par exemple :

for (final String name: properties.stringPropertyNames())
    map.put(name, properties.getProperty(name));

53voto

La manière efficace de le faire est simplement d'effectuer un cast vers une Map générique comme suit :

Properties props = new Properties();

Map<String, String> map = (Map)props;

Cela permettra de convertir un Map<Object, Object> en une Map brute, ce qui est "ok" pour le compilateur (seulement un avertissement). Une fois que nous avons un Map elle sera lancée vers Map<String, String> qui sera également "ok" (autre avertissement). Vous pouvez les ignorer avec l'annotation @SuppressWarnings({ "unchecked", "rawtypes" })

Cela fonctionnera car dans la JVM, l'objet n'a pas vraiment de type générique. Les types génériques sont juste une astuce qui permet de vérifier les choses au moment de la compilation.

Si une clé ou une valeur n'est pas une chaîne de caractères, un message d'erreur sera généré. ClassCastException erreur. Avec les Properties il est très peu probable que cela se produise, tant que vous n'utilisez pas les méthodes d'appel mutable de l'implémentation super Hashtable<Object,Object> de Properties .

Donc, si vous ne faites pas de choses désagréables avec votre instance de propriétés, c'est la solution.

37voto

Vous pourriez utiliser les goyaves de Google :

com.google.common.collect.Maps.fromProperties(Propriétés)

28voto

Seshadri Sastry Points 141

Que pensez-vous de ça ?

   Map properties = new Properties();
   Map<String, String> map = new HashMap<String, String>(properties);

Provoque un avertissement, mais fonctionne sans itérations.

28voto

Ben McCann Points 3755

La méthode Java 8 :

properties.entrySet().stream().collect(
    Collectors.toMap(
         e -> e.getKey().toString(),
         e -> e.getValue().toString()
    )
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X