0

我有对象类型的地图,我需要将此地图转换为字符串类型。

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

任何人都可以告诉我,如何将属性分配给上面的地图?

谢谢和问候, Msnaidu

4

7 回答 7

3

您可以直接转换:

Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>((Map)properties);
于 2013-06-20T08:26:17.107 回答
3

将属性添加到地图的最简洁方法是(按照您的示例):

for (String propName : properties.stringPropertyNames()) {
    map.put(propName, properties.getProperty(propName));
}

这在这种特殊情况下工作得很好,因为该Properties对象实际上是一个包含字符串键和值的映射,正如该getProperty方法所表明的那样。Map<Object, Object>仅出于可怕的向后兼容性原因才宣布它。

通过使用特定于属性的方法,而不是将其仅视为一个Map<Object, Object>,您可以Map<String, String>使用完美的类型安全性填充您的方法(而不是必须强制转换)。

于 2013-06-20T08:20:54.197 回答
3
Map<String, String> properties2Map(Properties p) {
            Map<String, String> map = new HashMap<String, String>();
            for(Map.Entry<Object, Object> entry : p.entrySet()) {
                String key = (String) entry.getKey(); //not really unsafe, since you just loaded the properties
                map.put(key, p.getProperty(key));
            }
            return map;
}

我还喜欢使用带有类型参数的实用方法来绕过泛型类型不变性并进行一些“向下转换”或“向上转换”(当我知道这样做是安全的时)。在这种情况下:

@SuppressWarnings("unchecked")
<A, B extends A> Map<B, B> downCastMap(Map<A,A> map) {
    return (Map<B, B>)map;
}

然后你可以写

Properties p = ...
Map<String, String> map = downCastMap(p);
于 2013-06-20T08:13:21.010 回答
1

因为我们知道Properties 已经是一个字符串到字符串的映射,所以使用 rawtype 和未经检查的转换来做它是节省的。只需发表评论:

    Properties properties = new Properties();    
    properties.load(instream); 

    @SuppressWarnings({ "rawtypes", "unchecked" })
    // this is save because Properties have a String to String mapping
    Map<String, String> map = new HashMap(properties);
于 2013-06-20T08:24:19.230 回答
1

随着Java 8Streams的添加,我建议您使用 Steam 提供的 API

在这里,我们假设每个值实际上都是 String 对象,转换为 String 应该是安全的:

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

Map<String,String> stringifiedMapSafe = map.entrySet().stream()
     .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));

现在,如果我们不确定所有元素都是String,我们想用 过滤键/值null

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

Map<String,String> stringifiedMapNotSafe = map.entrySet().stream()
             .filter(m -> m.getKey() != null && m.getValue() !=null)
             .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
于 2018-05-07T12:08:13.477 回答
0
Map<String,String> getPropInMap(Properties prop){       
    Map<String, String> myMap = new HashMap<String, String>();
    for (Object key : prop .keySet()) {
        myMap.put(key.toString(), prop .get(key).toString());
    }       
    return myMap;
}
于 2013-06-20T08:11:07.587 回答
0

遍历 Map Object,获取 kv,将它们变成字符串并将其放入 Map String。

Map<Object,Object> map1; // with object k,v
Map<String, String> mapString = new HashMap<String, String>();
for (Object key : map1.keySet()) {
                String k = key.toString();
                String v = mmap1.get(key).toString();
                mapString.put(k, v);
            }
于 2016-10-20T09:50:20.433 回答