为了账号安全,请及时绑定邮箱和手机立即绑定

Collectors.toMap中的Java 8 NullPointerException

Collectors.toMap中的Java 8 NullPointerException

长风秋雁 2019-08-12 10:05:03
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()调用替换为对此函数的调用,它就可以解决问题。


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 1824 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号