这是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);
|