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/