Java8 Stream 中的 Collectors.toMap 集合注意点

说明

在使用 Java8 中的 stream 时,如果使用 stream 生成 Map,要注意 key,value 不能为 null 值。
例如:

Map map = dataList.stream().collect(Collectors.toMap(MyData::getId, MyData::getName)));

如果 dataList 中的某个 name 字段为 null 值,此时整个 stream 语句的执行就会报错:空指针异常。

解决

这个算是 java8 版本的 bug,java9 版本之后已经修复。
在 Java 8 中可以使用下面的方式解决:
1、如果是null,就设置成一个特定值,然后再处理
2、使用collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)去收集,这个可允许null值
3、使用Optional类封装,收集成值类型为Optional的Map,然后处理

例如:

Map 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);

你可能感兴趣的:(Java8 Stream 中的 Collectors.toMap 集合注意点)