Collectors.toMap中的NullPointerException

错误日志如下: 

java.lang.NullPointerException: null
	at java.util.HashMap.merge(HashMap.java:1226)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.Collections$2.tryAdvance(Collections.java:4719)
	at java.util.Collections$2.forEachRemaining(Collections.java:4727)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
	at com.xxx.xxx.service.impl.DynamicFormColumnServiceImpl.lambda$getCodePropertyValue$24(DynamicFormColumnServiceImpl.java:465)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1321)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1723)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
	at com.xxx.xxx.service.impl.DynamicFormColumnServiceImpl.getCodePropertyValue(DynamicFormColumnServiceImpl.java:463)

代码: 

Map<String,List<PriceOverseasPostPerson>> listMap=list.stream()
.collect(Collectors.toMap(PriceOverseasPostConfig::getCountryCode,PriceOverseasPostConfig::getCountryManagers));

查看Collectors.toMap方法源码发现,在Collectors.toMap的调用过程中并不是我们平常常用的put方法,而是merge。如下:

default V merge(K key, V value,
            BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        Objects.requireNonNull(value);
        V oldValue = get(key);
        V newValue = (oldValue == null) ? value :
                   remappingFunction.apply(oldValue, value);
        if(newValue == null) {
            remove(key);
        } else {
            put(key, newValue);
        }
        return newValue;
    }

Objects.requireNonNull(value); value 为null则报空指针错误。

解决方案:

使用filter过滤所有NULL值

Map<String,List<PriceOverseasPostPerson>> listMap=list.stream().filter(f->CollectionUtil.isNotEmpty(f.getCountryManagers()))
                .collect(Collectors.toMap(PriceOverseasPostConfig::getCountryCode,PriceOverseasPostConfig::getCountryManagers));

Map<String,List<PriceOverseasPostPerson>> collect = list.stream()
                .collect(HashMap::new, (m, v)->m.put(v.getCountryCode(), v.getCountryManagers()), HashMap::putAll);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: collectors.toMap空指针是指在使用Java 8的Stream APIcollect方法时,使用了collectors.toMap方法,但是在该方法的参数出现了空指针异常。这通常是因为在Stream的元素存在null值,或者在toMap方法的keyMapper或valueMapper参数存在null值。解决方法是在使用toMap方法之前,先对Stream的元素进行过滤或者对keyMapper和valueMapper参数进行非空判断。 ### 回答2: collectors.tomap 空指针通常出现在使用 Java 8 的 Stream API 进行数据处理时,对数据进行分组、过滤、聚合等操作,并使用 toMap 方法进行结果收集的过程。 在 toMap 方法,要求必须传递两个参数,一个是 keyMapper,一个是 valueMapper。keyMapper 用于将元素映射为 map 的 key,valueMapper 用于将元素映射为 map 的 value。例如: ```java Map<Integer, String> map = list.stream() .collect(Collectors.toMap( item -> item.getId(), // keyMapper 将元素映射为 id item -> item.getName() // valueMapper 将元素映射为 name )); ``` 当收集器无法从 stream 处理出元素时,会导致 collectors.tomap 空指针的出现。比如以下情况: 1. 当列表null 值时,如果没有在 toMap 方法指定如何处理 null 值,则会出现空指针。可以使用 toMap 方法的第三个参数解决该问题,限定 null 值时的处理方式。 ```java Map<Integer, String> map = list.stream() .filter(item -> item != null) .collect(Collectors.toMap( item -> item.getId(), // keyMapper 将元素映射为 id item -> item.getName(), // valueMapper 将元素映射为 name (oldValue, newValue) -> oldValue // 处理 null 值并保留旧值 )); ``` 2. 当 keyMapper 映射出的 key 重复时,会导致 map 出现重复的 key。可以使用 toMap 方法的第三个参数指定相同 key 值的处理方式。 ```java Map<Integer, String> map = list.stream() .collect(Collectors.toMap( item -> item.getId(), item -> item.getName(), (oldValue, newValue) -> oldValue // 相同 key 值时保留旧值 )); ``` 3. 当 valueMapper 映射出的 value 为 null 时,会出现空指针。可以在 valueMapper 进行 null 值处理。 ```java Map<Integer, String> map = list.stream() .collect(Collectors.toMap( item -> item.getId(), item -> item.getName() == null ? "" : item.getName() // 处理 null 值 )); ``` 在实际开发,要注意 Stream API 的数据处理细节,以防止出现 collectors.tomap 空指针等问题,同时加强代码的健壮性和稳定性。 ### 回答3: 在JavaNullPointerException是一个非常常见的错误。当您在试图访问一个空对象时,将会发生空指针异常。collectors.tomap空指针错误是一种可能出现的优化问题,通常在归约操作使用。 collectors.tomapJava8提供的一个实用程序,用于将流元素转换为map对象。该方法的语法如下: public static <T, K, U> Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) 它需要两个函数 - keyMapper和valueMapper。它们将被用于从流元素获取键值对。使用这种方法之前,您必须确保您的数据在进行操作期间是非空的。否则,将发生collectors.tomap空指针错误。 通常,发生该错误的原因是: 1.您的流存在null元素。 2.您的keyMapper或valueMapper函数正在引用null元素。 3.运行collectors.tomap时使用的是null随机器。 为解决collectors.tomap空指针问题,可以通过以下方法: 1. 检查代码处理null值的地方,避免对null值进行操作。 2.使用Optional对象处理可能为空的对象,以避免引用null值。 3.确保您的keyMapper和valueMapper函数不引用null元素。 4. 提供一个默认值用于解决可能存在null的问题。 在处理数据时,尤其是在使用collectors.tomap方法时,尽量避免处理null值,这将有助于避免可能出现的错误。同时,确保您的代码null检查完整和准确也是一种好的编程实践,可以避免许多可能出现的NullPointerExceptions。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值