Spring中如何为HashMap同一Key添加多个值?
嘿,这个问题我之前做Spring项目的时候刚好遇到过!先给你明确说:标准的Java Map(比如HashMap)本身是键唯一的,同一个key只能存一个值,后面的会直接覆盖前面的。你原来写的那种在<entry>里重复写value属性的方式不仅XML语法不合法,就算能跑起来也达不到你要的效果——后面的abc会把前面的def覆盖掉。
那要实现一个key对应多个值,有两种常用的方案,看你需求选:
方案1:用Map<K, List<V>>作为属性类型
这是最通用的方式,不需要依赖Spring特定类,纯Java容器就能实现。
首先在你的Bean类里定义属性的时候,把abcMap的类型改成Map<String, List<String>>(假设你的键值都是字符串,可根据实际类型调整):
private Map<String, List<String>> abcMap; // 记得加上getter和setter方法
然后在Spring XML配置里,给同一个key的value用<list>包裹多个值:
<property name="abcMap"> <map> <entry key="615000"> <list> <value>def</value> <value>abc</value> </list> </entry> <!-- 其他key的配置也可以参照这个格式 --> </map> </property>
这样Spring初始化的时候,就会把615000这个key对应的value初始化成包含def和abc的List,完美实现一个key对应多个值的需求。
方案2:用Spring提供的MultiValueMap
Spring专门提供了MultiValueMap接口(位于org.springframework.util包下),它的设计就是用来处理一个key对应多个值的场景,常用实现类是LinkedMultiValueMap。
首先在Bean类里定义属性:
import org.springframework.util.MultiValueMap; import org.springframework.util.LinkedMultiValueMap; private MultiValueMap<String, String> abcMap; // 可以在构造方法里提前初始化,也可以靠Spring注入 // public YourBean() { // this.abcMap = new LinkedMultiValueMap<>(); // }
然后在XML配置里,有两种写法可选:
写法A:用List包裹值
<property name="abcMap"> <bean class="org.springframework.util.LinkedMultiValueMap"> <constructor-arg> <map> <entry key="615000"> <list> <value>def</value> <value>abc</value> </list> </entry> </map> </constructor-arg> </bean> </property>
写法B:直接添加多个同key的entry
因为MultiValueMap会自动把相同key的值收集成列表,所以也可以这么写,更贴合你想要的直观写法:
<property name="abcMap"> <bean class="org.springframework.util.LinkedMultiValueMap"> <property name="targetMap"> <map> <entry key="615000" value="def"/> <entry key="615000" value="abc"/> </map> </property> </bean> </property>
这种方式还自带很多方便的方法,比如add(key, value)追加值、get(key)直接返回List,用起来比自己维护Map<K, List<V>>更顺手。
总结一下:核心思路就是不要用标准的单值Map,而是把值的类型改成集合,或者用Spring专门的多值Map容器,这样就能实现一个key对应多个值的需求啦!
内容的提问来源于stack exchange,提问作者FDFDGSFG DJDBM

