Collectors.toMap中的Java 8 NullPointerException如果其中一个值为'null' ,Java 8 Collectors.toMap将抛出一个NullPointerException。我不明白这种行为,map可以包含null指针作为值而没有任何问题。有没有一个很好的理由为什么值不能为空Collectors.toMap?另外,是否有一个很好的Java 8方法来修复它,或者我应该恢复到普通的旧循环?我的问题的一个例子:import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.stream.Collectors;class Answer {
private int id;
private Boolean answer;
Answer() {
}
Answer(int id, Boolean answer) {
this.id = id;
this.answer = answer;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Boolean getAnswer() {
return answer;
}
public void setAnswer(Boolean answer) {
this.answer = answer;
}}public class Main {
public static void main(String[] args) {
List<Answer> answerList = new ArrayList<>();
answerList.add(new Answer(1, true));
answerList.add(new Answer(2, true));
answerList.add(new Answer(3, null));
Map<Integer, Boolean> answerMap =
answerList .stream()
.collect(Collectors.toMap(Answer::getId, Answer::getAnswer));
}}堆栈跟踪:Exception in thread "main" java.lang.NullPointerException
at java.util.HashMap.merge(HashMap.java:1216)
at java.util.stream.Collectors.lambda$toMap$168(Collectors.java:1320)
at java.util.stream.Collectors$$Lambda$5/1528902577.accept(Unknown Source)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1359)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)这个问题在Java 11中仍然存在。
3 回答

摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
我写了一个Collector
,与默认的java不同,当你有null
值时,它不会崩溃:
public static <T, K, U> Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) { return Collectors.collectingAndThen( Collectors.toList(), list -> { Map<K, U> result = new HashMap<>(); for (T item : list) { K key = keyMapper.apply(item); if (result.putIfAbsent(key, valueMapper.apply(item)) != null) { throw new IllegalStateException(String.format("Duplicate key %s", key)); } } return result; });}
只需将您的Collectors.toMap()
调用替换为对此函数的调用,它就可以解决问题。
添加回答
举报
0/150
提交
取消