java - 在 Java 中,当值为 null 时,收集器映射抛出 NullPointerException,为什么?

标签 java java-8 hashmap java-stream

public static void main(String[] args) {
    Map<String, String> m = new HashMap<String, String>();
    m.put("a", "One");
    m.put("b", null);

    toUpperKeys1(m); // NullPointerException
    toUpperKeys2(m); // Working fine
    toUpperKeys3(m); // NullPointerException
}

static Map<String, String> toUpperKeys1(Map<String, String> map) {
    // Scenario 1 : Throwing NullPointerExpecption because Map.Entry::getValue is null
    return map.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().toUpperCase(), Map.Entry::getValue));
}

static Map<String, String> toUpperKeys2(Map<String, String> map) {
    // Scenario 2 : Working fine
    Map<String, String> newMap = new HashMap<String, String>();
    map.entrySet().forEach(e -> newMap.put(e.getKey().toUpperCase(), e.getValue()));
    return newMap;
}

static Map<String, String> toUpperKeys3(Map<String, String> map) {
    // Scenario 3: Throwing NullPointerExpecption because e.getValue() is null
    return map.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().toUpperCase(), e -> e.getValue()));
}

堆栈跟踪:

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.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1699)
    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:566)
    at com.project.Demo.toUpperKeys1(Demo.java:25)
    at com.project.Demo.main(Demo.java:17)

由于场景 2(for-each 循环)工作正常,但场景 1 (Map.Entry::getValue) 和场景 3 (e -> e.getValue()) 都抛出 NPE。

为什么 toMap 存在这个问题,而在 HashMap 的概念中,键和值都允许 null?

请解释一下。

最佳答案

正如文档中所说的Collectors::toMap

The returned Collector disallows null keys and values.

"b"=null 中确实有一个 null 值。你的想法是错误的...在不进行操作的情况下输入值当然你在“操纵”。

关于java - 在 Java 中,当值为 null 时,收集器映射抛出 NullPointerException,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60872332/

相关文章:

java.lang.String 无法转换为 com.example.expandablelistview.NewsItem

java - 无法禁用 ORMLites 日志记录

java - EJB定时器服务: Changing location of file data store

java - 如何在 JComboBox 中填充数据?

java - 直接从字符串创建流

java - Volatile HashMap 与 ConcurrentHashMap

java - 是否有与 Python 的 defaultdict 等效的 Java?

java - Objects.hashCode() 和 new Object().hashCode() 的区别?

java - 使用 Java 8 java.time api 解析 ISO 时间戳(仅限标准版)

java - 错误 : Could not find or load main class ( in Java 8)