核心是用Arrays.stream()转流+Collectors.toMap()映射,支持一维/二维/基本类型数组,需处理key冲突(如(v1,v2)->v2)和指定Map实现类(如LinkedHashMap::new)。

核心在于用 Arrays.stream() 把数组“打开”成流,再用 Collectors.toMap() 定义键值映射规则——整个过程不手动循环、不新建临时集合,真正实现函数式表达。
明确键值提取逻辑
数组元素类型决定你怎么取 key 和 value:
- 一维字符串数组(如
String[] names = {"Alice", "Bob"}):key 可以是元素本身,value 可以是索引或固定值 - 二维数组(如
String[][] data = {{"name1", "25"}, {"name2", "30"}}):每行第一个元素作 key,第二个作 value - 基本类型数组(如
int[] nums = {1, 2, 3}):需先用.boxed()转为包装类流,再映射
处理 key 冲突是关键细节
如果多个元素映射出相同 key(比如姓名重复、索引冲突),toMap 默认会抛 IllegalStateException: Duplicate key。必须显式提供合并策略:
- 保留后出现的值:
(v1, v2) -> v2 - 拼接字符串:
(v1, v2) -> v1 + "," + v2 - 转为 List 收集:
(v1, v2) -> { v1.addAll(v2); return v1; },配合 value mapper 返回Arrays.asList(value)
按需指定 Map 实现类型
默认生成 HashMap,但若需要有序或线程安全,可传入第四参数:
- 保持插入顺序:
LinkedHashMap::new - 自然排序 key:
TreeMap::new - 并发场景:
ConcurrentHashMap::new
常见实用写法示例
以字符串数组转 Map<String, Integer>(元素 → 索引)为例:
String[] arr = {"a", "b", "c", "b"};
Map<String, Integer> map = Arrays.stream(arr)
.collect(Collectors.toMap(
s -> s, // key:字符串本身
s -> Arrays.asList(arr).indexOf(s), // value:首次出现索引
(i1, i2) -> i1, // 冲突时保留第一个索引
LinkedHashMap::new // 保持插入顺序
));
// 结果:{a=0, b=1, c=2}
注意:Arrays.asList(arr).indexOf(s) 效率不高,大数据量建议预建索引映射或改用 IntStream 遍历下标。


















