将Object转换为特定数字类型的优雅方式

时间:2017-03-18 13:36:44

标签: java guava

 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>

3 个答案:

答案 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();