NullPointerException:元素无法映射到 null 键

2022-09-02 09:37:13

我读过这个话题:

收集器.分组依据不接受空键

但是我不明白如何将其应用于我的问题:

我的代码:

Map<String, List<MappingEntry>> mappingEntryMap = mapping.getMappingEntries()
                .stream()
                .collect(Collectors.groupingBy(MappingEntry::getMilestone, Collectors.mapping(e -> e, Collectors.toList())));

对我来说,有时可以返回空值。对于我的情况来说没关系,但我看到:MappingEntry::getMilestone

Caused by: java.lang.NullPointerException: element cannot be mapped to a null key
    at java.util.Objects.requireNonNull(Objects.java:228)
    at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:907)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    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)

如何避免此异常?


答案 1

请改用并指定使用 a(因为它允许一个空键)Collectors.toMapHashMap

 Collectors.toMap(
       MappingEntry::getMilestone,
       x -> {
           List<MappingEntry> list = new ArrayList<>();
           list.add(x);
           return list;
       },
       (left, right) -> {
            left.addAll(right);
            return left;
       },
       HashMap::new

)

答案 2

假设您希望保留对象,而不管何时为 nullnon-null,并且知道当特定合约不满足时将抛出 a,那么我们可以通过使用替换键来对具有 null 里程碑的对象进行分组,同时按预期对其他对象进行分组,从而避免这种情况。MappingEntrygetMilestone()NullPointerExceptionMappingEntryMappingEntry

Map<String, List<MappingEntry>> mappingEntryMap = 
             mapping.getMappingEntries()
                    .stream()
                    .collect(groupingBy(m -> m.getMilestone() == null ?
                                  "absentMilestone" : m.getMilestone()));

这里的诀窍是使用一个三元运算符,该运算符提供一个键,将所有没有里程碑的对象分组到一个组中,如果里程碑没有丢失,那么我们可以按照您的期望按其值进行分组。MappingEntry