NullPointerException:元素无法映射到null键

时间:2017-12-18 12:47:58

标签: java java-8 grouping java-stream

我已阅读主题:

Collectors.groupingBy doesn't accept null keys

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

我的代码:

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

对我来说MappingEntry::getMilestone有时可以返回null。我的情况还可以,但我明白了:

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)

如何避免此异常?

3 个答案:

答案 0 :(得分:9)

使用// set flag for date found or not boolean dateFound = false; do{ //look for if available date element List<WebElement> availableDates = driver.findElements(By.xpath("//div[@class='week ng-scope']/button[contains(@tabindex,'0')][1]")); //if available date is present then click on 1st available date if(availableDates.size()>0) { for(WebElement date : availableDates) { date.click(); break; } } // if not available then click on next arrow button else { WebElement next = driver.findElement(By.xpath("//button[@id='NextPeriod']")); dateFound = true; } //continue till date is found }while(dateFound); 代替并指定使用Collectors.toMap(因为它允许一个空键)

HashMap

答案 1 :(得分:3)

假设您要保留MappingEntry个对象,无论getMilestone() null 非null ,并且知道NullPointerException如果未满足特定合同,则会抛出1}}我们可以通过使用替换密钥对具有 null 里程碑的MappingEntry对象进行分组,然后将另一个MappingEntry分组来避免这种情况{1}}对象应该是它们。

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

这里的技巧是使用三元运算符,它提供了一个键,将具有缺少里程碑的所有MappingEntry对象组合到一个组中,如果没有里程碑,则我们可以按照你期望的价值进行分组。

答案 2 :(得分:1)

您可以使用Collector.of方法指定自定义收藏家,并使用HashMap生成地图,因为根据Java-8的{​​{1}}文档

  

[...]允许空值和空键。 [...]

HashMap