【发布时间】:2012-11-18 12:44:43
【问题描述】:
我为此花了几个小时的时间,但需要继续并找到一个丑陋的解决方法,但我很乐意清理我的代码,问题是:
public static void function1(Map<String, Float> map)
{
for(String key : map.keySet()) {
Float val = map.get(key);
// val is null here, throws NPE as soon as we try to use it
}
}
public static void function2(Map<String, Float> map)
{
Iterator<Entry<String, Float>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<String, Float> entry = it.next();
String key = entry.getKey();
Float val = entry.getValue();
// do something with key & val, works fine
}
}
参数Map<String, Float> map 当然已经正确初始化并且不包含任何空值。
附带说明,如果我将参数更改为 Map map 并仅使用字符串对,则 function1 可以正常工作。我的目标是只有 1 个带有泛型 Map<? extends Object, ? extends Object> map 的函数,我可以将其用于两种类型的地图。
任何建议表示赞赏,谢谢! 托马斯
编辑:我添加了一些非常基本的内省以使该函数与泛型一起使用。我可以确认在使用键集时我仍然得到空值,而我遵循下面的建议来使用条目集。下面是我的代码(第一个函数工作正常,而第二个函数返回空元素。
// yeah, it's aweful, but it works.
public static JsonNode map2JSON(Map<? extends Object, ? extends Object> map)
{
ObjectNode dummyObject = Json.newObject();
ArrayNode result = dummyObject.putArray("dummyKey");
for(Entry<?, ?> entry : map.entrySet()) {
ObjectNode mapElementNode = result.addObject();
if("java.lang.String".equalsIgnoreCase(entry.getKey().getClass().getName())) {
String key = (String)entry.getKey();
if("java.lang.Float".equalsIgnoreCase(entry.getValue().getClass().getName())) {
Float val = (Float)entry.getValue();
mapElementNode.put(key, val);
} else if("java.lang.String".equalsIgnoreCase(entry.getValue().getClass().getName())) {
String val = (String)entry.getValue();
mapElementNode.put(key, val);
}
}
}
return result;
}
// result here contains valid keys (the string part) and null values (the float part)
@Deprecated
public static JsonNode mapSF2JSON(Map<String, Float> map)
{
ObjectNode dummyObject = Json.newObject();
ArrayNode result = dummyObject.putArray("dummyKey");
for(String key : map.keySet()) {
ObjectNode mapElementNode = result.addObject();
mapElementNode.put(key, map.get(key));
}
return result;
}
【问题讨论】:
-
创建地图时如何插入字符串?你能把那个sn-p贴出来吗?
-
显示地图数据,如果能显示完整代码......
-
添加一个 sn-p 来回复下面的答案。我确定这些字符串不为空,因为如果我调用 map.toString() 我可以正常读取整个内容