我有一个具有以下签名的地图(多种地图):
Map<String, Set<String>> motherChildIndex;
如果键在映射中不存在,我希望它返回一个空集(与null相对),因此我偶然发现了
getOrDefault
方法,该方法应允许我有效地“忽略”空值。这是我的相关代码:
motherChildIndex
.getOrDefault(personId, Collections.emptySet()) //personId is just a string that may or may not be in the map, hence getOrDefault
.stream() //I get the warning here
.map(personsIndex::get) //Not important to reproduce
.forEach(children::add); //Not important to reproduce
在
.stream()
行上,我收到警告:方法调用“流”可能会产生“ java.lang.NullPointerException”
为什么?我以为
getOrDefault()
应该永远不会返回null。我将Android Studio用作我的IDE,如果有什么不同的话。
最佳答案
看起来getOrDefault()在Map.class中具有LatestNullable批注,该批注看起来像Nullable批注(这完全是我的烦恼,如果您想阅读以下内容,唯一的问题是这个:what is the @RecentlyNonNull annotation?)。
因此,我假设IntelliJ读取了它并立即警告您可能返回空值,因此认为stream()可能会抛出NullPointerException(因为IntelliJ映射可以为null),然后建议您对nonNull进行检查地图。
奇怪的是(显然在stackoverflow问题中)注释不在Java文档中。