说明
在使用 Java8 中的 stream 时,如果使用 stream 生成 Map,要注意 key,value 不能为 null 值。
例如:
Map<String, String> map = dataList.stream().collect(Collectors.toMap(MyData::getId, MyData::getName)));
如果 dataList 中的某个 name 字段为 null 值,此时整个 stream 语句的执行就会报错:空指针异常。
解决
这个算是 java8 版本的 bug,java9 版本之后已经修复。
在 Java 8 中可以使用下面的方式解决:
1、如果是null,就设置成一个特定值,然后再处理
2、使用collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)去收集,这个可允许null值
3、使用Optional类封装,收集成值类型为Optional的Map,然后处理
例如:
Map<String, String> map = dataList.stream()
.collect(Collectors.toMap(MyData::getId, p -> Optional.ofNullable(p.getName())
.orElse("")));
datalist.stream().collect(HashMap::new,(n,v)->n.put(v.getId(),v.getName()), HashMap::putAll);