Java中將 Map 轉換為 Spring MultiValueMap

banq發表於2024-06-07

在本教程中,我們將把Map 轉換為Spring MultiValueMap ,並透過清晰的示例理解它。

在 Spring Framework 中,MultiValueMap是一種專用對映,它針對單個鍵儲存多個值。它有利於處理 HTTP 請求引數、標頭,以及一個鍵可能對應多個值的其他場景。將標準Map轉換為MultiValueMap可能是 Spring 應用程式中的常見要求。

什麼是MultiValueMap?
MultiValueMap是 Spring 提供的一個介面,它擴充套件了Map <K, List<V>>介面。它允許我們根據單個鍵儲存多個值。

最常用的實現是LinkedMultiValueMap。

將 Map 轉換為 Spring MultiValueMap 的方法
假設我們有一個Map<String, List<String>>並且我們想將它轉換為MultiMap<String, String>。

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

我們應該確保我們的專案包含 Spring 框架。如果我們使用Maven,我們將以下依賴項新增到我們的pom.xml中:

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

作為初始步驟,我們將建立一個包含一些資料的示例Map<String, List<String>> :

Map<String, List<String>> map = new HashMap<>();
map.put(<font>"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<String, List<String>>轉換為MultiValueMap<String, String>。我們初始化一個新的LinkedMultiValueMap並遍歷原始對映中的每個條目,將每個鍵及其關聯的值列表新增到MultiValueMap。

這種結構在 Spring MVC 中特別有用,用於處理與單個鍵關聯的多個值的表單資料或查詢引數。

2. 使用CollectionUtils.toMultiValueMap()
Spring 框架在CollectionUtils中提供了一種實用方法,可以直接將Map<K, List<V>>轉換為MultiValueMap<K,V>:

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<String, List<String>>轉換為MultiValueMap<String, String>。它將對映條目收集到新的LinkedMultiValueMap中,並保留原始對映的鍵值結構。

相關文章