如何优雅地从地图中获取唯一的元素

时间:2013-05-07 20:03:08

标签: java map get

我有一个Map,只能容纳一个Entry。我确实知道它,因为它保存了执行如下查询的结果:

SELECT MAX(COLUMN) FROM SOMETABLE 

在最坏的情况下,它应该返回null。 现在我想要得到那个结果。我面临两种方法,但我认为应该有更好的解决方案。

我的测试代码:

HashMap<String, Object> result = new HashMap<String, Object>();
result.put("maxColumn", new Integer(1));

解决方案1:

Integer maxValue = (Integer) result.get(result.keySet().iterator().next());

解决方案2:

Integer maxValue = (Integer) result.values().toArray()[0];

有更好的方法吗?你觉得哪一个声明更多/更便宜?

编辑:我不允许使用任何其他数据结构,因为Map<String, Object>是我正在使用的持久性API返回的结果类型。

2 个答案:

答案 0 :(得分:2)

最简单,最干净的是选项2,因为它直接转到了值(不是通过get()):

Integer i = (Integer) result.values().toArray()[0];

但它有点丑陋而且有演员阵容。我倾向于将其重构为整个团队可以使用的类型化实用程序方法:

public class MapUtils {

    public static <T> T getSingleValue(Map<String, Object> map) {
        return (T) map.values().toArray()[0];
    }
}

通过输入方法,可以避免代码中的丑陋演员,因为你会像这样使用它:

Integer maxValue = MapUtils.getSingleValue(result);

这里java可以使用类型推断来确定您的期望。如果没有强制转换,您可以更改maxValue的类型,代码仍然有效。使用演员表时,您必须更改类型的演员才能匹配。

答案 1 :(得分:1)

如果您完全确定只有一个元素:

Integer maxValue = map.values().iterator().next()

List<Integer> integerList = new ArrayList<Integer>(map.values());
Integer maxValue = integerList.get(0);

for (Integer maxValue : map.values) {
    doStuffWithMaxValue(maxValue);           
}

施法并不是一个好主意。