Java中将 Map 转换为 Spring MultiValueMap

在本教程中,我们将把Map 转换为Spring MultiValueMap ,并通过清晰的示例理解它。

在 Spring Framework 中,MultiValueMap是一种专用映射,它针对单个键保存多个值。它有利于处理 HTTP 请求参数、标头,以及一个键可能对应多个值的其他场景。将标准Map转换为MultiValueMap可能是 Spring 应用程序中的常见要求。

什么是MultiValueMap?
MultiValueMap是 Spring 提供的一个接口,它扩展了Map >接口。它允许我们根据单个键存储多个值。

最常用的实现是LinkedMultiValueMap。

将 Map 转换为 Spring MultiValueMap 的方法
假设我们有一个Map>并且我们想将它转换为MultiMap

以下是我们可以做到的方法。

我们应该确保我们的项目包含 Spring 框架。如果我们使用Maven,我们将以下依赖项添加到我们的pom.xml中:

<dependency>
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId>
    <version>6.1.7</version>
</dependency>

作为初始步骤,我们将创建一个包含一些数据的示例Map> :

Map<String, List<String>> map = new HashMap<>();
map.put("rollNo", Arrays.asList("4", "2", "7", "3"));
map.put(
"name", Arrays.asList("John", "Alex", "Maria", "Jack"));
map.put(
"hobbies", Arrays.asList("Badminton", "Reading novels", "Painting", "Cycling"));


1. 使用手动迭代
我们可以使用常规迭代将Map转换为MultiValueMap :

MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
    multiValueMap.put(entry.getKey(), entry.getValue());
}

上面的代码将Map>转换为MultiValueMap。我们初始化一个新的LinkedMultiValueMap并遍历原始映射中的每个条目,将每个键及其关联的值列表添加到MultiValueMap。

这种结构在 Spring MVC 中特别有用,用于处理与单个键关联的多个值的表单数据或查询参数。

2. 使用CollectionUtils.toMultiValueMap()
Spring 框架在CollectionUtils中提供了一种实用方法,可以直接将Map>转换为MultiValueMap

MultiValueMap<String, String> multiValueMap = CollectionUtils.toMultiValueMap(map);

3. 使用 Java 流
Java Streams API 还可以用于以更函数式的编程风格执行转换:

MultiValueMap<String, String> multiValueMap = map.entrySet()
  .stream()
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedMultiValueMap::new));

此代码使用 Java Streams 将Map>转换为MultiValueMap。它将映射条目收集到新的LinkedMultiValueMap中,并保留原始映射的键值结构。