java8 Stream流Collectors.toMap value为空报NPE

1,182 阅读1分钟

一、问题

今天在使用Collectors.to时遇到一个NPE,按理说Hashmap的key value都可以为null,不应该啊...

看了一下日志发现Map中有个键值对的value为null,在调用Collectors.toMap时报了NullPointerException

二、分析

点开看看源码:

public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                            Function<? super T, ? extends U> valueMapper,
                            BinaryOperator<U> mergeFunction,
                            Supplier<M> mapSupplier) {
    BiConsumer<M, T> accumulator
            = (map, element) ->** map.merge**(keyMapper.apply(element),
                                          valueMapper.apply(element), mergeFunction);
    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}

image.png

三、解决方法

写成这样的格式就可以了:

Map<String, String> resultMap = map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(),
			entry -> Optional.ofNullable(entry.getValue()).orElse("")));

在使用Collectors.toMap时需要记住几点:
1、key不能有重复,否则会报错,因为Map的key不能重复
2、value不能为空,否则报空指针