我已阅读主题:
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)
如何避免此异常?
答案 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