我有一个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返回的结果类型。
答案 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);
}
施法并不是一个好主意。