0

我有一个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 返回的结果类型。

4

2 回答 2

2

最简单和最干净的是选项 2,因为它直接指向值(而不是 via 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并且代码仍然可以工作。使用演员表,您必须同时更改类型演员表以匹配。

于 2013-05-07T20:29:47.280 回答
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);           
}

铸造不是一个好主意。

于 2013-05-07T20:09:11.047 回答