上周在处理流时遇到了一个非常奇怪的NPE,这给我带来了很多麻烦,所以现在在使用Stream时,我感觉需要更加小心谨慎地处理NPE。
以下是我的当前方法:
我的问题是,我处理的是外部POJO,因此无法更改它并使其具有空值安全性,因此我必须调整我的代码。
以下是一些限制: 1)errorList-这里不能为null,因此调用
你会如何改进这个流?我觉得我的
以下是我的当前方法:
private boolean matchSomeError(final List<ErrorAtMessageLevel> errorList) {
return errorList.stream()
.filter(errorAtMessageLevel -> errorAtMessageLevel.getErrorSegment() != null && errorAtMessageLevel.getErrorSegment().getErrorDetails() != null)
.map(errorAtMessageLevel -> errorAtMessageLevel.getErrorSegment().getErrorDetails())
.anyMatch(errorDetails -> SOME_FANCY_ERROR_CODE.equals(errorDetails.getErrorCode()));
}
我的问题是,我处理的是外部POJO,因此无法更改它并使其具有空值安全性,因此我必须调整我的代码。
以下是一些限制: 1)errorList-这里不能为null,因此调用
.stream()
是安全的-当它为空时,它只会返回false
2)getErrorSegment()
和getErrorDetails()
都可以为null,这就是为什么我使用filter的原因,以确保它们都不为null
3)getErrorCode()
可能为null,但它永远不会抛出NPE,因为与null匹配时它只会返回false-对我来说没关系。你会如何改进这个流?我觉得我的
.filter()
很糟糕,它可以变得更好。最近写了很多这样的代码,因为我不确定流如何处理null,并且不想在.map()
中调用null时得到NPE。
Optional
。 - MC Emperor