最近在工作中,遇到一个特殊的Map —— MultiValueMap,它到底是什么呢?写一篇博客记录下所找到的线索。
MultiValueMap 是什么
MultiValueMap 是一个继承Map的接口,一个Key可以对应多个Value
- 对应源码
包spring-core-5.0.7.RELEASE.jar
public interface MultiValueMap<K, V> extends Map<K, List<V>> {
@Nullable
V getFirst(K var1);
void add(K var1, @Nullable V var2);
void addAll(K var1, List<? extends V> var2);
void addAll(MultiValueMap<K, V> var1);
void set(K var1, @Nullable V var2);
void setAll(Map<K, V> var1);
Map<K, V> toSingleValueMap();
}
MultiValueMap 一个Key对应多个Value
- 示例
// 实例化
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
// 为name放入3个值
params.add("name", "Name参数1");
params.add("name", "Name参数2");
params.add("name", "Name参数3");
// 打印第三个参数
System.out.println(params.get("name").get(2));
// 放入id一个idList
List idList = new ArrayList();
idList.add(UUID.randomUUID().toString().replaceAll("-",""));
idList.add(UUID.randomUUID().toString().replaceAll("-",""));
idList.add(UUID.randomUUID().toString().replaceAll("-",""));
params.put("id", idList);
// 打印第三个参数
System.out.println(params.get("id").get(2));
// 打印所有值
Set<String> keySet = params.keySet();
for (String key : keySet) {
List<String> values = ((LinkedMultiValueMap<String, String>) params).get(key);
for (String value : values) {
System.out.println(key + ": " + value);
}
}
Spring Cloud Gateway GlobalFilter 过滤器中的MultiValueMap
获取请求值
@Component
public class AuthSignatureFilter implements GlobalFilter, Ordered {
...
...
...
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 获取authToken
String authToken = params.getFirst("authToken");
// 获取sign
String sign = params.getFirst("sign");
// 我们取到值,可以进行验证了
...
...
...
return chain.filter(exchange);
}
}
其它的用法(插入值和迭代)
- 代码如下:
MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
multiValueMap.add("k1", "v1");
multiValueMap.add("k2", "v2");
//打印所有值
Set<String> keySet = multiValueMap.keySet();
for (String key : keySet) {
List<String> values = multiValueMap.get(key);
System.out.println(StringUtils.join(values.toArray()," ")+":"+key);
}
网友评论