Java中Map转List及List转Map的方法(简单好用!)
作者:九尾狐的yi巴
1. Map转List
1.1 将Map的key转换为List
    public void testMapToList(){
        // 创建一个Map
        Map<String, Integer> map = new HashMap<>();
        map.put("key1", 1);
        map.put("key2", 2);
        map.put("key3", 3);
        // 将Map的key转换为List
        List<String> keyList = new ArrayList<>(map.keySet());
        // 打印结果
        System.out.println(keyList);
    }输出:
[key1, key2, key3]
1.2 将Map的value转换为List
    public void testMapToList(){
        // 创建一个Map
        Map<String, Integer> map = new HashMap<>();
        map.put("key1", 1);
        map.put("key2", 2);
        map.put("key3", 3);
        // 将Map的value转换为List
        List<Integer> keyList = new ArrayList<>(map.values());
        // 打印结果
        System.out.println(keyList);
    }输出:
[1, 2, 3]
所以说这两个方法的区别就是在
new ArrayList<>时选择使用map.values()还是map.keySet()
2. List转Map
2.1 最普通的List转Map
    public void testListToMap(){
        // 创建一个List
        List<String> list = new ArrayList<>();
        list.add("key1");
        list.add("key2");
        list.add("key3");
        // 将List转换为Map
        Map<String, Integer> map = list.stream()
                .collect(Collectors.toMap(key -> key, value -> 0, (v1, v2) -> v1)); // value里默认放一个0
        // 打印结果
        System.out.println(map);
    }输出:
{key1=0, key2=0, key3=0}
要特别注意里面的
(v1, v2) -> v1)必须带上。如果你的key里重复的时候没这句话会异常:java.lang.IllegalStateException: Duplicate key 0
(v1, v2) -> v1 表示当出现重复的键时,选择保留原始的值 v1,而忽略新值 v2。如果你希望在出现重复的键时采取其他操作,例如取最大值、取最小值或者进行求和等操作,您可以在合并函数中编写相应的逻辑。例如,可以使用(v1, v2) -> Math.max(v1, v2)来选择两个值中的最大值。
2.2 List转Map同时保证顺序
假如我的list的放入顺序变了:
List<String> list = new ArrayList<>();
    list.add("key3");
    list.add("key2");
    list.add("key1");用第一个方式得到的Map是乱序的,如果想保证顺序,可以借助LinkedHashMap.
public void testListToMap(){
        // 创建一个List
        List<String> list = new ArrayList<>();
        list.add("key3");
        list.add("key2");
        list.add("key1");
        // 将List转换为Map
        Map<String, Integer> map = list.stream()
                .collect(Collectors.toMap(key -> key, value -> 0, (v1, v2) -> v1, LinkedHashMap::new)); // value里默认放一个0
        // 打印结果
        System.out.println(map);
    }输出:
{<!-- -->key3=0, key2=0, key1=0}2.3 List转Map(对象类型且key拼接)
假如有这个User:
@Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class User{
        private Integer id;
        private String name;
        private Integer age;
    }想要id拼接_拼接name作为key,age作为value,转Map。代码:
public void testListToMap2() {
        // 创建一个List
        List<User> list = new ArrayList<>();
        list.add(new User(1,"Tom",10));
        list.add(new User(2,"Tim",10));
        list.add(new User(3,"Jim",10));
        // 将List转换为Map
        Map<String, Integer> map = list.stream()
                .collect(Collectors.toMap(key -> key.getId()+"_"+key.getName(), value -> value.getAge(), (v1, v2) -> v1)); 
        System.out.println(JSON.toJSON(map));
    }输出:
{"3_Jim":10,"2_Tim":10,"1_Tom":10}
2.4 List转Map(id作为key,每个元素作为value)
public void testListToMap2() {
        // 创建一个List
        List<User> list = new ArrayList<>();
        list.add(new User(1,"Tom",10));
        list.add(new User(2,"Tim",10));
        list.add(new User(3,"Jim",10));
        // 将List转换为Map
        Map<Integer, User> map = list.stream()
                .collect(Collectors.toMap(User::getId, value -> value, (v1, v2) -> v1));
        System.out.println(JSON.toJSON(map));
    }输出:
{
"1": {
"name": "Tom",
"id": 1,
"age": 10
},
"2": {
"name": "Tim",
"id": 2,
"age": 10
},
"3": {
"name": "Jim",
"id": 3,
"age": 10
}
}
完结撒花~
总结
到此这篇关于Java中Map转List及List转Map的文章就介绍到这了,更多相关Java Map和List互选转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
