Java中Map转List及List转Map的方法(简单好用!)

 更新时间:2023年07月28日 09:35:48   作者:九尾狐的yi巴  
这篇文章主要给大家介绍了关于Java中Map转List及List转Map的相关资料,可以使用Java 8的Stream API将Java Map转换为List,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

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&#61;0, key2&#61;0, key1&#61;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作为keyage作为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互选转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何使用SpringBoot的缓存@Cacheable

    详解如何使用SpringBoot的缓存@Cacheable

    这篇文章主要为大家介绍了如何使用SpringBoot的缓存@Cacheable详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java中Arrays.sort()方法的比较器详解

    Java中Arrays.sort()方法的比较器详解

    这篇文章主要介绍了Java中Arrays.sort()方法的比较器详解,Arrays.sort(Object[] a)此方法看似没有要求我们实现比较器,对于基本数据类型,String类型确实如此,因为这些类型中已经自带了compareTo()方法,需要的朋友可以参考下
    2023-12-12
  • Java的常见热门ORM框架优缺点区别

    Java的常见热门ORM框架优缺点区别

    Java ORM框架是一种用于将Java对象映射到关系型数据库中的工具,使得开发人员能够通过对象操作数据库而不必直接使用SQL查询,Java开发变得更加高效和易于维护,选择适合你的ORM框架是根据你的需求决定的,比如你的应用场景,数据结构和技术水平等
    2024-02-02
  • Java设计模式之桥接模式实例详解

    Java设计模式之桥接模式实例详解

    这篇文章主要介绍了Java设计模式之桥接模式,结合实例形式详细分析了桥接模式的概念、功能、Java实现方法及相关注意事项,需要的朋友可以参考下
    2017-09-09
  • springcloud之自定义简易消费服务组件

    springcloud之自定义简易消费服务组件

    这篇文章主要介绍了springcloud之自定义简易消费服务组件,本篇来使用rest+ribbon消费服务,并且通过轮询方式来自定义了个简易消费组件,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java状态机的一种优雅写法分享

    Java状态机的一种优雅写法分享

    状态机是一种数学模型,对于我们业务实现有很大的帮助。我们可以用非常多的方法实现状态机,这篇文章就来介绍一个状态机优雅的实现方法,希望对大家有所帮助
    2023-04-04
  • JDK8接口的默认与静态方法-接口与抽象类的区别详解

    JDK8接口的默认与静态方法-接口与抽象类的区别详解

    这篇文章主要介绍了JDK8接口的默认与静态方法-接口与抽象类的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • java收集器Collector案例汇总

    java收集器Collector案例汇总

    这篇文章主要介绍了java收集器Collector案例汇总,Collectors作为Stream的collect方法的参数,Collector是一个接口,它是一个可变的汇聚操作,更多相关介绍,需要的朋友可以参考下
    2022-06-06
  • JAVA正则表达式提取key-value类型字符值代码实例

    JAVA正则表达式提取key-value类型字符值代码实例

    这篇文章主要给大家介绍了关于JAVA正则表达式提取key-value类型字符值的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-10-10
  • java判断某个点是否在所画多边形/圆形内

    java判断某个点是否在所画多边形/圆形内

    这篇文章主要为大家详细介绍了java判断某个点是否在所画多边形或圆形内的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论