• JDK8stream将list转Map对象报错java.lang.IllegalStateException


    JDK8有很多新特性,比如lambda表达式,函数式编程以及stream流的使用,这几个新特性,使用过之后就爱不释手了,比如将list集合通过stream可以直接转换成map对象。

    语法:

    Map map = list.stream.stream().collect(Collectors.toMap(list集合中对象::get属性,list对象别名->list对象别名));

    示例:

    Map<Integer , EmployeeTeacherCertificate> employeeTeacherCertificateMap =employeeTeacherCertificates.stream().collect(Collectors.toMap(EmployeeTeacherCertificate::getEmployeeId,cert->cert));

    说明:

    employeeTeacherCertificates List集合对象

    EmployeeTeacherCertificate:是List中的集合对象

    是不是很简单。

    但是,如果list中比如说empId有重复的话,就会报错。如下:

    错误信息说,employeeId=4429的值在集合中有重复的。

    这个时候怎么解决呢?

    我们可以使用toMap的另一个重载方法。带有去重的方法。

    语法:

    Collectors.toMap(keyMapper, valueMapper, mergeFunction)

    源码:

    参数说明:

    前两个参数都是与之前一样 key 和 value得取值属性, 第三个参数是当key 发生重复时处理的方法,注释上的解释如下:

    简单一句话:

    一种合并函数,用于解决两者之间的冲突与提供的相同键相关联的值到{@link Map#merge(Object, Object, BiFunction)}。

    该合并函数有两个参数,第一个参数为当前重复key 之前对应的值,第二个为当前重复key 现在数据的值。

    1、重复时采用后面的value 覆盖前面的value

    也可以简写成这样:

    Map<String, String> map = list.stream().collect(

    Collectors.toMap(Student :: getClassName, Student :: getStudentName,

    (key1 , key2)-> key2 ));

    也可以简写成这样:

    Map<String, String> map = list.stream().collect(

    Collectors.toMap(Student :: getClassName, Student :: getStudentName,

    (value1, value2 )->{

    return value2;

    }));

    凯哥这里就使用了第二种方案:

    第二种简单也方便看懂。

    最后来个总结吧。

    总结:

    这几个办法都是基于toMap重载方法第三个参数来实现的!至于哪个方法最好,我觉得应该取决于具体业务!

    欢迎大家一起学习一起交流。凯哥Java

  • 相关阅读:
    torchvision.transforms用法
    下采样上采样 nn.MaxPool2d() nn.AvgPool2d()池化层
    resnet系列网络(BottelNeck、BasicBlock)
    alexnet网络结构及pytorch实现
    pytorch 使用Module类和Sequential类自定义模型
    model.eval()和model.train()
    RNN循环神经网络recurrent neural network和lstm、gru
    python assert断言
    LeNet:GradientBased Learning Applied to Document Recognition
    11.innodb的行格式
  • 原文地址:https://www.cnblogs.com/kaigejava/p/12052789.html
Copyright © 2020-2023  润新知