MapUtil

package com.common.util.collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class MapUtil {

private static final Map initMap;
static {
//初始化静态Map,且不能修改。
Map aMap = new HashMap();
aMap.put(1, "one");
aMap.put(3, "three");
aMap.put(5, "five");
aMap.put(2, "two");
// aMap.put(6, null);
initMap = Collections.unmodifiableMap(aMap);
}

/**
* 取得key List 无序
* @param map
* @return
*/
public static List getMapKeyList(Map map) {

return new ArrayList(map.keySet());


}

/**
* 取得value List 无序
* @param map
* @return
*/
public static List getMapValueList(Map map) {

return new ArrayList(map.values());
}

/**
* 取得entry List 无序
* @param map
* @return
*/
public static List getMapEntryList(Map map) {

return new ArrayList(map.entrySet());
}

/**
* 取得entry List key有序
* 注:map 不要 null key
* @param map
* @return
*/
public static List getMapEntryListSortKey(Map map){
List entryList = getMapEntryList(map);
Collections.sort(entryList, new Comparator(){

public int compare(Object o1, Object o2) {
Entry e1 = (Entry)o1;
Entry e2 = (Entry)o2;
return e1.getKey().toString().compareTo(e2.getKey().toString());
}
});
return entryList;
}

/**
* 取得entry List value有序
* 注:map 不要 null value
* @param map
* @return
*/
public static List getMapEntryListSortValue(Map map){
List entryList = getMapEntryList(map);
Collections.sort(entryList, new Comparator(){

public int compare(Object o1, Object o2) {
Entry e1 = (Entry)o1;
Entry e2 = (Entry)o2;
return e1.getValue().toString().compareTo(e2.getValue().toString());
}
});
return entryList;
}



/**
* 复制Map, 2个map同步更新
* @param sourceMap
* @return
*/
public static Map copyMap(Map sourceMap){
return Collections.synchronizedMap(sourceMap);
}

/**
* 清空Map,不能用。若要用,则new HashMap();
*/
public static Map emptyMap(Map map){
return Collections.emptyMap();
}




public static void displayList(List list){
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
}


public static void displayMap(Map map){
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Entry entry = (Entry) it.next();
Object key = entry.getKey();
Object value = entry.getValue();

System.out.println(key + "====" + value);
}
}

/**
* 链接有序Map
* @return
*/
public static Map getLinkedHashMap(){
Map map = new LinkedHashMap();
// map.put(4, "three");
// map.put(1, "one");
// map.put(2, "two");
// map.put(3, "three");
return map;
}

/**
* 同步,线程安全的map
* @return
*/
public static Map getHashtable(){
Map map = new Hashtable();

return map;
}




public static void main(String[] args) {

// displayMap(MapUtil.initMap);

// List list = getMapKeyList(MapUtil.initMap);
// displayList(list);
//
// List list2 = getMapValueList(MapUtil.initMap);
// displayList(list2);
//
// List list3 = getMapEntryList(MapUtil.initMap);
// displayList(list3);
//
// System.out.println("========");
//
// List list4 = getMapEntryListSortKey(MapUtil.initMap);
// displayList(list4);
//
// System.out.println("========");
//
// List list5 = getMapEntryListSortValue(MapUtil.initMap);
// displayList(list5);

Map linkedHashMap = getLinkedHashMap();
displayMap(linkedHashMap);




// System.out.println("========");
// Map m1 = copyMap(MapUtil.initMap);
// displayMap(m1);
// System.out.println("========");
// m1.put("2", "four");
// displayMap(m1);
//
// System.out.println("========");
// displayMap(MapUtil.initMap);

}

}
<think> 嗯,用户想了解MapUtil.builder的使用方法及相关特性,这个问题很具体。从引用[1]的代码片段来看,用户正在处理一个认证模块的开发,需要构建用户信息映射表。用户可能遇到了需要快速构建不可变映射表的需求,特别是在处理特殊用户类型(如客户端模式)时。 用户提供的引用中,引用[1]展示了MapUtil.builder的实际使用场景——当检测到虚拟用户ID(userId == -1L)时,快速构建包含昵称和部门ID的映射表。这个使用案例很典型,说明用户需要的是轻量级构建工具而非重量级的集合框架。 考虑到用户的项目涉及登录模块(引用[1][^4]),可能对集合的线程安全性和不可变性有潜在需求。MapUtil.builder这类工具最大的优势在于链式调用的简洁性和最终生成的不可变集合。不过用户没有提到具体的技术栈,需要默认以主流的Hutool工具库作为解释对象。 用户提问非常聚焦,说明已经看过相关代码但需要更系统的说明。需要特别注意两点:一是明确builder模式在集合构建中的优势,二是强调最终生成的集合特性(不可修改)。引用[3]的CSV规范也暗示用户所在团队注重数据格式的规范性,因此示例代码的格式必须绝对标准。 在准备回答时,应该突出三个实用场景:初始化固定键值对(如示例中的客户端信息)、动态条件构建(用户代码里的if分支)、以及与其他集合的转换。用户上次关于Spring Security的上下文(引用[4])也值得关联,比如可以提一句“这种构建方式特别适合在认证成功后构造UserDetails的附加属性”。 </think> 以下是关于`MapUtil.builder`的详细使用指南及相关信息,结合技术文档和最佳实践整理: --- ### **一、MapUtil.builder 核心功能** `MapUtil.builder` 是**链式构建不可变Map**的工具方法,常见于工具库(如Hutool),用于简化Map初始化操作。其核心特性: 1. **链式调用**:通过`.put()`连续添加键值对 2. **生成不可变Map**:最终通过`.build()`返回线程安全的不可修改Map 3. **空值安全**:多数实现自动过滤`null`值键或值(具体取决于库实现) --- ### **二、使用示例详解** #### 1. 基础构建(引用[1]案例) ```java Map<String, String> userInfo = MapUtil.builder(LoginUser.INFO_KEY_NICKNAME, "开放API客户端") .put(LoginUser.INFO_KEY_DEPT_ID, null) // 允许null值 .build(); // 生成最终Map ``` - **结果**:`{nickname: "开放API客户端", deptId: null}` - **注意**:生成的Map不可修改,调用`put()`会抛`UnsupportedOperationException` #### 2. 动态构建(带逻辑判断) ```java MapUtil.builder<String, Object> builder = MapUtil.builder("status", 200); if (errorCode != null) { builder.put("error", errorCode); // 条件添加字段 } Map<String, Object> result = builder.build(); ``` #### 3. 类型安全构建(泛型控制) ```java Map<String, Number> metrics = MapUtil.<String, Number>builder("max", 99.5) .put("min", 0.01) .build(); ``` --- ### **三、底层实现原理(以Hutool为例)** ```java public static <K, V> MapBuilder<K, V> builder(K key, V value) { // 初始化HashMap(实际可替换为LinkedHashMap保持顺序) return new MapBuilder<>(MapUtil.newHashMap()).put(key, value); } public static class MapBuilder<K, V> { private final Map<K, V> map; public MapBuilder<K, V> put(K key, V value) { map.put(key, value); return this; } public Map<K, V> build() { // 返回不可修改视图(非克隆新对象) return Collections.unmodifiableMap(map); } } ``` **关键点**: - 默认使用`HashMap`,可通过重载方法指定`Map`实现 - `build()`返回**只读视图**(原始Map修改仍受影响) - 自动处理初始容量(JDK16+优化为按需扩容) --- ### **四、适用场景与最佳实践** 1. **场景** ✅ 构建配置项(如引用[1]的登录用户元数据) ✅ 快速构造API响应结构 ✅ 单元测试Mock数据 2. **性能建议** - 大数据量(>1000项)时改用`HashMap`构造函数指定初始容量 - 需频繁修改的Map,应避免使用`.build()`的不可变特性 3. **替代方案对比** | 方法 | 可变性 | 线程安全 | 代码简洁度 | |---------------------|--------|----------|------------| | `MapUtil.builder` | 不可变 | 不安全 | ⭐⭐⭐⭐ | | `Collections.singletonMap` | 不可变 | 不安全 | ⭐⭐ | | `new HashMap<>(){{ put(k,v); }}` | 可变 | 不安全 | ⭐⭐⭐ | --- ### **五、常见问题排查** 1. **`UnsupportedOperationException`** → 对`.build()`后的Map调用`put()/remove()`导致,需重建Map 2. **空值处理差异** → 某些库(如Guava)的`ImmutableMap`禁止null值,需确认具体实现 3. **顺序丢失问题** → 默认无顺序保证,需改用: ```java MapUtil.builder(new LinkedHashMap<>()).put(...) // 保持插入顺序 ``` --- ### 📚 **推荐扩展** 1. Hutool Map工具文档:[MapUtil (hutool.cn)](https://www.hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E9%9B%86%E5%90%88%E5%B7%A5%E5%85%B7-MapUtil) 2. Google Guava不可变集合:[Immutable Collections | Guava](https://github.com/google/guava/wiki/ImmutableCollectionsExplained) 3. Java标准库不可修改视图:[Collections (Java SE 17 & JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html#unmodifiableMap(java.util.Map))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值