浅谈MultiValueMap
最大特点:一key,多value
先看如下代码:
public static void main(String[] args) { MultiValueMap<String, String> valueMap = new LinkedMultiValueMap<>(); valueMap.add("1","1"); valueMap.add("1","2"); valueMap.add("1","3"); valueMap.add("1","4"); valueMap.add("1","5"); valueMap.add("2","1"); valueMap.add("2","2"); valueMap.add("3","1"); for (Map.Entry<String, List<String>> stringListEntry : valueMap.entrySet()) { System.out.println(“key:”+stringListEntry.getKey()); List<String> value = stringListEntry.getValue(); System.out.println("value:"+value); } }
输出:
key:1 value:[1, 2, 3, 4, 5] key:2 value:[1, 2] key:3 value:[1]
我在SpringBoot中可能遇到的情况:
假如有如下url:(可能有个复选框,让你选你的兴趣inters,你选了两个 basketball和 game)
http://localhost:8080/car/3/owner/lisi?age=18&inters=basketball&inters=game
如果用@Requestparam + map接收所有参数 :
你得到的结果是这样的(发现params 里面并没有game)
但是你用MultiValueMap去接收:
你得到:
你会发现MultiValueMap的value都是list类型,为什么呢?
你点进去一看:
哦,这样啊,那没事了。
总结:
1. 如果遇到 一键多值的需求, 要考虑下MultiValueMap,
2. 问题的最根本其实是 如果存在参数有时候既要一对一,又要一对多的时候,可以考虑让value转型,转型为list(更高维度), (一对一其实也是一对多的特殊情况,你只需要让一个value一组即可,就好像SpringBoot设计的MultiValueMap,
既能满足
"age":["18"]
又能满足
"inters":["basketball","game"]
)