流的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}