1、现象
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>(){{
add(new Student("a",1));
add(new Student("b",2));
add(new Student("c",3));
}};
// 当value为空时,报NullPointerException
Map<String, String> collect = list.stream().collect(Collectors.toMap(x -> x.getName(), x -> x.getAge(), (a, b) -> a));
}
@Data
public static class Student {
private String name;
private int age;
public Student(name,age){
this.name = name;
this.age = age;
}
}
}
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.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
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.eju.goodhouse.test.T.main(T.java:22)
2、原因
Collectors.toMap(),key可以为null,但 value不能为null, 否则抛空指针异常nullPointerException
3、解决
// 对空判断
Map<String, String> collect1 = list.stream().collect(
Collectors.toMap(
x -> x.getName(),
x -> Objects.nonNull(x.getPetName()) ? x.getPetName() : "",
(a, b) -> StringUtils.isNotBlank(a) ? a : b
);
// 使用Optional对空值进行处理
Map<String, String> collect2 = list.stream().collect(
Collectors.toMap(
x -> x.getName(),
x -> Optional.ofNullable(x.getPetName()).orElse(""),
(a, b) -> StringUtils.isNotBlank(a) ? a : b
);