給定 List<Map<String, Object>> list,需將其轉換為 Map<String, Map<String, Object>> 或 HashMap。關鍵難點在於:Map 必須有唯一鍵,而 List 元素本身無天然主鍵,需根據業務邏輯指定鍵的來源。
"id")、業務邏輯生成的唯一標識,或索引位置;List<Map<String, Object>> list = ...; // 數據源
// 方案 1:指定 Map 中的 "id" 字段為鍵(鍵衝突保留後者)
Map<String, Map<String, Object>> result = list.stream()
.collect(Collectors.toMap(
m -> String.valueOf(m.get("id")), // 鍵提取函數
m -> m, // 值映射函數
(v1, v2) -> v2 // 鍵衝突合併策略:保留後者
));
// 方案 2:使用索引作為鍵(無業務主鍵時)
Map<Integer, Map<String, Object>> indexedMap = IntStream.range(0, list.size())
.boxed()
.collect(Collectors.toMap(i -> i, list::get));
// 方案 3:傳統 for-each 寫法(兼容舊版本/需複雜邏輯)
Map<String, Map<String, Object>> manualMap = new HashMap<>();
for (Map<String, Object> item : list) {
String key = String.valueOf(item.get("businessKey")); // 業務鍵
if (key != null) {
manualMap.put(key, item); // 或根據需要處理衝突
}
}
null 會拋 NullPointerException,需預先過濾或使用 Optional;Map<String, Object> 取值需轉型,建議定義 DTO 類替代原始 Map;ConcurrentHashMap 或收集器 Collectors.toConcurrentMap;Map<String, List<Map<String, Object>>> grouped = list.stream()
.collect(Collectors.groupingBy(m -> String.valueOf(m.get("category"))));
List 轉 Map 的本質是建立從業務鍵到數據記錄的索引。選擇合適的鍵提取策略、衝突處理方式,並善用 Stream API 可寫出簡潔高效的代碼。