美文网首页
MultiValueMap

MultiValueMap

作者: 常扬 | 来源:发表于2019-03-13 16:42 被阅读0次

    最近在工作中,遇到一个特殊的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);
    
    }
    
    

    相关文章

      网友评论

          本文标题:MultiValueMap

          本文链接:https://www.haomeiwen.com/subject/dtetmqtx.html