使用Java8 的lambda将list集合转化成map,然后出现异常
org.springframework.jdbc.datasource.DataSourceUtils]-Returning JDBC Connection to DataSource
[org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver]-Resolving exception from handler [public java.util.Map<java.lang.String, java.lang.Object> com.mxys.generate.sp.controller.DoTablesController.showTableById(javax.servlet.http.HttpServletRequest,java.lang.Long)]: java.lang.IllegalStateException: Duplicate key com.mxys.generate.sp.model.TemplateTableRow@65fe4741
[org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver]-Resolving exception from handler [public java.util.Map<java.lang.String, java.lang.Object> com.mxys.generate.sp.controller.DoTablesController.showTableById(javax.servlet.http.HttpServletRequest,java.lang.Long)]: java.lang.IllegalStateException: Duplicate key com.mxys.generate.sp.model.TemplateTableRow@65fe4741
[org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver]-Resolving exception from handler [public java.util.Map<java.lang.String, java.lang.Object> com.mxys.generate.sp.controller.DoTablesController.showTableById(javax.servlet.http.HttpServletRequest,java.lang.Long)]: java.lang.IllegalStateException: Duplicate key com.mxys.generate.sp.model.TemplateTableRow@65fe4741
[org.springframework.web.servlet.DispatcherServlet]-Could not complete request
根据服务器报的错误是将list转化成map集合的时候,出现了非法状态异常,排查代码,
Map<String, TemplateTableRow> tempChild = row.getChild().stream().collect(Collectors.toMap(TemplateTableRow::getRowValue, Function.identity());
发现有一个问题,没有排除重复的值,在map中,我的代码的rowvalue 是可以重复的,但是我没有排除,所以map中会有key重复,也就是string的值会重复,要使用Java8 的函数的特性,控制一下生成的时候,如果有重复值的取值方法,我的改进如下:
也就是有重复值的时候,我取先进来的值,也就是old。
总结一下:java.lang.IllegalStateException异常,产生的原因可能就是数据结构的原因,数据结构没有正确处理,在错误log中,`Duplicate key` 复制主键出错,就明确了错误的地方。
**引以为戒,在使用Java8转化为map的时候,要考虑字段是否是唯一的**