文章目录

  • MultiValueMap
    • MultiValueMap 是什么
      • MultiValueMap 一个Key对应多个Value
    • Spring Cloud Gateway GlobalFilter 过滤器中的MultiValueMap
      • 获取请求值
      • 其它的用法(插入值和迭代)

MultiValueMap

最近在工作中,遇到一个特殊的Map —— MultiValueMap,它到底是什么呢?写一篇博客记录下所找到的线索。

MultiValueMap 是什么

MultiValueMap 是一个继承Map的接口,一个Key可以对应多个Value

  • 对应源码 包spring-core-5.0.7.RELEASE.jar
public interface MultiValueMap<K, V> extends Map<K, List<V>> {@NullableV 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 {.........@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 获取authTokenString authToken = params.getFirst("authToken");// 获取signString 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相关推荐

  1. java multivaluemap_java – 使用自定义值集合类型创建Commons Collections MultiValueMap

    Apache Commons Collections库的4.0版本增加了泛型支持.我无法转换代码以利用它: 我想要一个MultiValueMap,它将String作为键,并将一个字符串集合作为值.但: ...

  2. Map之一个Key存多个Value的MultiValueMap(一个键多个值)

    在日常的开发中经常用到键值对,也就是Map啦,我们知道Map是一个接口,它的特点是一个Key对应一个Value,也就是一个键对应一个值,但是往往我们需要一个Key对应多个Value,这种时候系统的AP ...

  3. MultiValueMap是什么?怎么使用?

    MultiValueMap 可以同一个key下面放多个value,此类来自spring,在spring-core里面 代码: public static void main(String[] args ...

  4. Spring RestTemplate为何必须搭配MultiValueMap?

    微服务之间的大多都是使用 HTTP 通信,这自然少不了使用 HttpClient. 在不适用 Spring 前,一般使用 Apache HttpClient 和 Ok HttpClient 等,而一旦 ...

  5. Http请求之优雅的RestTemplate

    前言 本篇博客为对RestTemplate总结 HttpURLConnection 在讲RestTemplate之前我们来看看再没有RestTemplate之前是怎么发送http请求的. privat ...

  6. jquery发送put请求_浅谈GET,POST,PUT发送请求

    一般我们在浏览器的地址栏输入网址回车后,发送的是GET请求 当用表单提交时(最普遍的是用户登录),我们可以指定是GET还是POST请求,这里需要注意的是有的浏览器并不支持PUT请求,那后台restfu ...

  7. java单元测试启动类配置_Springboot 单元测试简单介绍和启动所有测试类的方法

    最近一段时间都是在补之前的技术债,一直忙着写业务代码没有注重代码的质量,leader也在强求,所有要把单元测试搞起来了 我把单元测试分为两种 一个是service的单元测试,一个是controller ...

  8. spring boot 2.0 源码分析(二)

    在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /*** Run the ...

  9. SpringBoot之@EnableConfigurationProperties分析

    我们在用SpringBoot进行项目开发的时候,基本上都使用过@ConfigurationProperties这个注解,我们在之前的文章中也说过ConfigurationPropertiesBindi ...

最新文章

  1. 利用尾递归减少栈空间的消耗
  2. glide 显示图片慢_做个看图片的App玩玩_第一篇
  3. [设计模式][c++]状态切换模式
  4. [你必须知道的.NET] 开篇有益
  5. 10大反直觉的数学结论
  6. linux多CPU进程负载均衡解析
  7. Rust : 危险! 关于字符串切片以及取值......
  8. Java 实现树结构计算各个节点数的和
  9. Eclipse中,使用Darkest主题,static方法在main中不是斜体的解决办法
  10. 【突破次元壁】谁说二次元离我们遥远?Python特效火遍全网,关键技术原来是它。
  11. Qos介绍及功能->分类标记->流量管理(令牌桶)->拥塞管理与拥塞避免
  12. SMILES 与 SELFIES 的转换代码
  13. 数据湖和数据仓库的区别是什么?
  14. c语言二维数组输入数据,c语言编写程序,把下面的数据输入到一个二维数组中:...
  15. 高通正式发布骁龙 778G 5G 芯片
  16. 即将打破x86和ARM垄断地位的RISC-V,你了解吗?
  17. js计算当前时间的为年的第几周,以及周对应的时间范围
  18. 常用的Linux外文文献,Linux大学外文文献翻译及原文.doc
  19. CCFL、WLED、RGB LED背光液晶屏优缺点
  20. 四旋翼无人机学习第23节--原理图与PCB库开源计划

热门文章

  1. 深度学习——学习率衰减(learning rate decay)
  2. Tomcat服务器安装、配置教程
  3. DIV 布局之上下布局上不动下自动适应
  4. 点击输入框,标题上移
  5. 蛋白质相互作用系列:GN快速算法
  6. ODB++数据解析二
  7. Python添加pywin32
  8. windows,远程开机,远程唤醒(WOL,Wake-on-LAN),只在刚关机一段时间内可以实现,时间长了就无法实现
  9. java是什么?带你了解
  10. 工程项目管理数字化系统建设持续推动施工企业数字化转型行稳致远