Java如何来将HashMap的值转为List呢?且看本文。

问题

代码如下:

private final Map<String, RuleParam> quantityMap = new ConcurrentHashMap<String, RuleParam>(16);

if (!quantityMap.isEmpty()) {
    List<RuleParam> ruleParamList = (List<RuleParam>) quantityMap.values();
}

上述代码,会报异常“java.util.concurrent.ConcurrentHashMap$ValuesView cannot be cast to java.util.List”。

原因

因为HashMap#values() 返回java.util.Collection<V>,并不能将强制转换到ArrayList中,因获得ClassCastException。

解决

建议使用ArrayList(Collection<? extends V>)构造函数。此构造函数接受一个实现了Collection<? extends V>接口的参数。

private final Map<String, RuleParam> quantityMap = new ConcurrentHashMap<String, RuleParam>(16);

if (!quantityMap.isEmpty()) {
    List<RuleParam> ruleParamList = new ArrayList<>(quantityMap.values());
}

参考

https://stackoverflow.com/questions/15522546/why-hashmap-values-are-not-cast-in-list