JDK8特性--Stream(list转map)

本文介绍了Java 8 Stream API中如何使用Collectors的toMap方法将List转换为Map,包括普通转换、处理重复Key的策略以及处理字段为空的情况。在遇到重复Key时,提供了保留第一个、合并值以及创建值集合的解决方案,并展示了在字段为空时避免空指针异常的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK8特性--Stream(求和,过滤,排序)   这里是其他一些stream的有用法,有需要的可以看看。

言归正传,现在主要是是学习list转map,使用的方法是Stream中Collectors的toMap方法:Collectors.toMap。

首先我们构造一个list

        //声明一个List集合
        List<People> list = new ArrayList();
        list.add(new People("小A", "数学"));
        list.add(new People("小B", "语文"));
        list.add(new People("小C", "英语"));
        System.out.println(list.toString());
        //将list转换map

打印结果如下 

 

1.普通转换

        Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse));
        System.out.println(map);

打印结果如下

 

2.有相同key时,会报错

同样构建一个list

        //声明一个List集合
        List<People> list = new ArrayList();
        list.add(new People("小A", "数学"));
        list.add(new People("小B", "语文"));
        list.add(new People("小C", "英语"));
        list.add(new People("小C", "历史"));  //新增行
        System.out.println(list.toString());   
  

list打印如下: 

 这样如果还如上面的转化 。

会报错,错误如下:

解决办法:

2.1 留下一个

        //将list转换map,->箭头后的值是当遇到相同时,留下第一个还是第二个
        Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse,(key1 , key2)-> key2 ));
        System.out.println(map);

打印如下:

 2.2重复时将前面的value 和后面的value拼接起来

Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 ));
        System.out.println(map);

打印结果如下:

2.3 重复时将重复key的数据组成集合

        Map<String, List<String>> map = list.stream().collect(Collectors.toMap(People::getName,
                p ->  {
                    List<String> getNameList = new ArrayList<>();
                    getNameList.add(p.getCourse());
                    return getNameList;
                },
                (List<String> value1, List<String> value2) -> {
                    value1.addAll(value2);
                    return value1;
                }
               ));
        System.out.println(map);

打印结果如下:

 

3.字段为空的情况,会出现空指针异常。

构建一个list,普通转换

        //声明一个List集合
        List<People> list = new ArrayList();
        list.add(new People("小A", "数学"));
        list.add(new People("小B", "语文"));
        list.add(new People("小C", null));
        System.out.println(list.toString());
        //将list转换map,->箭头后的值是当遇到相同时,留下第一个还是第二个
        Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse));
        System.out.println(map);

报错如下:

3.1解决办法如下: 

        Map<String, List<String>> map = list.stream().collect(Collectors.toMap(People::getName,
                p ->  {
                    List<String> getNameList = new ArrayList<>();
                    getNameList.add(p.getCourse());
                    return getNameList;
                },
                (List<String> value1, List<String> value2) -> {
                    value1.addAll(value2);
                    return value1;
                }
        ));
        System.out.println(map);

打印结果如下:

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值