JDK8特性--Stream(list转map)

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

打印结果如下 

JDK8特性--Stream(list转map) 

1.普通转换

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

打印结果如下

JDK8特性--Stream(list转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打印如下: 

JDK8特性--Stream(list转map) 这样如果还如上面的转化 。

会报错,错误如下:

JDK8特性--Stream(list转map)

解决办法:

2.1 留下一个

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

打印如下:

JDK8特性--Stream(list转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);

打印结果如下:

JDK8特性--Stream(list转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);

打印结果如下:

JDK8特性--Stream(list转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);

报错如下:

JDK8特性--Stream(list转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);

打印结果如下:

JDK8特性--Stream(list转map) 

 

上一篇:es5.4.0查询模板鸡肋学习


下一篇:Vue【增加push(),删除splice()】