Map<String,Object> node = Maps.newHashMap();
int courseId = ((Number) node.get("d")).intValue();
该节点是包含密钥'd'
的地图,相关值为short
数字,上述代码是将short
转换为int
的安全方式,但代码风格很痛苦。 :(
我的问题:有没有更优雅的方式来处理这个案例,我已经搜索了'Guava'
lib,但没有找到任何相关内容。
这里我更新了问题,原始数据是zookeeper节点上的json对象。在反序列化之后,它将值向上转换为Object,结果为Map<String,Object>
答案 0 :(得分:1)
如果不仅有Short作为地图值怎么办?
这是一种通用的方法:
@Test
public void test() throws Exception {
Map<String, Object> node = new HashMap<>();
int courseInteger = popNumber(node.get("d"));
// test popNumber method with Integer
int i = popNumber(5);
System.out.println(i); // output 5
// test popNumber method with Short
short s = popNumber(new Short("23"));
System.out.println(s); // output 23
// test popNumber method with Long
long l = popNumber(2342L);
System.out.println(l); // output 2342
}
private <Num extends Number> Num popNumber(Object o) {
if (o instanceof Number)
return (Num) o;
// you may do smth else if you get not Number or its child
// as map value rather to retur null
return null;
}
答案 1 :(得分:0)
如果您知道Object
值实际上是Short
,则优雅/简洁的方式是投射到Short
:
int courseId = (Short) node.get("d");
short
- &gt; int
是一种“扩大”转换,因为int
的范围更大,因此不需要其他内容。并自动处理拆箱。
由于您将Object
存储在Map
,我无法看到您如何避免演员。
答案 2 :(得分:0)
您可以将地图的值从对象更新为数字吗?
然后:
Map<String,Number> node = Maps.newHashMap();
int courseId = node.get("d").intValue();