list.stream()转map的空指针问题踩坑

这是Java中使用stream处理集合时一个很容易被忽视的问题,稍微不注意就很致命,最近正好遇到了,特此记录一下。

1.问题

众所周知,Java的HashMap的key和value值都可以为null的,但是,如果使用stream方法将List转成Map,Collectors.toMap()转换后的Map的value值是不能取null的,不做处理就会报空指针异常。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import lombok.Builder;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamTest {

@Data
@Builder
static class Student {
String id;
String name;
}

public static void main(String[] args) {
List<Student> studentList = new ArrayList<Student>() {{
add(Student.builder().id("1001").name("张三").build());
add(Student.builder().id("1002").name("李四").build());
add(Student.builder().id("1003").build());
}};
Map<String, String> studentMap = studentList.stream()
.collect(Collectors.toMap(Student::getId, Student::getName));
System.out.println(studentMap);
}
}

以上代码中,studentList的第三个元素的name属性为null,导致转成Map时value为空报错。

Collectors.toMap()底层代码也可以找到其使用到了Map的merge方法对value做了为空校验,当value为空时会抛空指针异常:

2.解决方法

1
2
3
4
Map<String, String> studentMap = studentList.stream()
.collect(HashMap::new,
(map, item) -> map.put(item.getId(), item.getName()),
HashMap::putAll);

list.stream()转map的空指针问题踩坑
https://blog.kevinchu.top/2023/10/19/list-stream-to-map-null-error/
作者
Kevin Chu
发布于
2023年10月19日
许可协议