今天在项目中遇到了一个optional用法的bug,代码情况类似如下:
public RequestDto assemble(ItemInfo itemInfo, AdditionalData data) {
return Optional.ofNullable(itemInfo)
.map(item -> map1(item))
.orElse(map2(data)))
}
private RequestDto map1(ItemInfo itemInfo) {
return RequestDto.builder()
.payload(itemInfo.getContent())
.build();
}
private RequestDto map2(AdditionalData data) {
return RequestDto.builder()
.payload(data.getContent())
.build();
}
当调用 assemble(itemInfo, null) 的时候,会报NPE错误。
错误原因在于 orElse 里的方法,无论optional里有没有值,都会执行。
解决方法就是用 orElseGet, 变成 orElseGet(() -> map2(data)),这样当有值的时候orElseGet里的表达式就不会执行。