流的toMap方法不允许value为null值的追溯及解决办法

流的toMap方法报错java.lang.NullPointerException

User类

class User{
    // 姓名
    private String name;

    // 年龄
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(age, user.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

流的收集器使用toMap如果value中存在null值,会报错java.lang.NullPointerException

package com.fspdfcy;

import org.apache.poi.ss.formula.functions.T;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author fspdf
 * @version 1.0
 * @description
 * @date 2022/11/17
 * @since test
 */
public class Test08 {
    public static void main(String[] args) {
        List<User> users = Collections.singletonList(new User());
        Map<String, Integer> map1 = users.stream().collect(Collectors.toMap(User::getName, User::getAge));
    }

Exception in thread "main" java.lang.NullPointerException
	at java.util.HashMap.merge(HashMap.java:1225)
	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:499)
	at com.fspdfcy.Test08.main(Test08.java:19)

追溯源码如下,toMap调用merge方法,而这方法会校验value是否为null,null则抛出NullPointerException异常。

在这里插入图片描述
在这里插入图片描述

解决办法一:对value进行为null处理(如果不影响逻辑)

Map<String, Integer> map1 = users.stream().collect(Collectors.toMap(User::getName, user -> user.getAge() == null ? 0 : user.getAge()));
        System.out.println(map1);

结果

{null=0}

解决办法二:如果只是为了收集key和value的映射,可以使用自己编写的方法,如下。

package com.fspdfcy;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author fspdf
 * @version 1.0
 * @description
 * @date 2022/11/17
 * @since test
 */
public class Test08 {
    public static void main(String[] args) {
        List<User> users = Collections.singletonList(new User());
        Map<String, Integer> map2 = toMap(users, User::getName, User::getAge);
        System.out.println(map2);
    }

    public static <T, K, U> Map<K, U> toMap(Collection<T> collections, Function<? super T, ? extends K> keyMapper,
                                            Function<? super T, ? extends U> valueMapper) {
        Map<K, U> map = new HashMap<>();
        for (T collection : collections) {
            map.put(keyMapper.apply(collection), valueMapper.apply(collection));
        }
        return map;
    }
}

结果

{null=null}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值