1.前言
- 在开发过程中,java8流行的stream流非常的好用,简化代码,又容易读懂,但是它有一个大炕。
2. 大坑重现
- 当list集合里某个元素的属性为空,并且你使用
Collectors.groupingBy()
方法对这个属性进行分组,这时系统会报错。
List<DTO> list = Lists.newArrayList();
for(int i=0;i<5;i++){
DTO dto = new DTO();
dto.setCode("code"+i);
if(i==0||i==4){
dto.setCenterRandomSysId(null);
}else {
dto.setCenterRandomSysId("111");
}
list.add(dto);
}
Map<String, List<DTO>> map = list.stream().collect(Collectors.groupingBy(DTO::getCenterRandomSysId)); //大坑出现,这里会报错
System.out.println(map);
- 执行结果
Exception in thread “main” java.lang.NullPointerException: element cannot be mapped to a null key
3. 解决方法
- 解决它也很简单,在分组之前加一个过滤操作。
List<DTO> list = Lists.newArrayList();
for(int i=0;i<5;i++){
DTO dto = new DTO();
dto.setCode("code"+i);
if(i==0||i==4){
dto.setCenterRandomSysId(null);
}else {
dto.setCenterRandomSysId("111");
}
list.add(dto);
}
Map<String, List<DTO>> map = list.stream()
.filter(dto-> StringUtils.isNotBlank(dto.getCenterRandomSysId()))
.collect(Collectors.groupingBy(DTO::getCenterRandomSysId)); //大坑出现,这里会报错
System.out.println(map);
- 执行结果
{111=[{“centerRandomSysId”:“111”,“code”:“code1”}, {“centerRandomSysId”:“111”,“code”:“code2”}, {“centerRandomSysId”:“111”,“code”:“code3”}]}