Java ObjectUtils defaultIfNull返回默认值,即使第一个参数不是null

Java ObjectUtils defaultIfNull返回默认值,即使第一个参数不是null,java,java-8,Java,Java 8,我正在将2个函数传递给ObjectUtils.defaultIfNull。第一个是函数,若AddressID else发现为null,则返回Customer;第二个参数是函数,用于创建新的Customer。 执行后,我看到2个客户,即使在执行getCustomerByAddressID(sourceData,supportParam)返回非空值-createNewCustomer(supportParam)后,仍显示调试 这个问题是因为代码格式还是我遗漏了什么?我是否应该使用Optional.o

我正在将2个函数传递给
ObjectUtils.defaultIfNull
。第一个是函数,若AddressID else发现为null,则返回Customer;第二个参数是函数,用于创建新的Customer。 执行后,我看到2个客户,即使在执行
getCustomerByAddressID(sourceData,supportParam)
返回非空值-
createNewCustomer(supportParam)
后,仍显示调试


这个问题是因为代码格式还是我遗漏了什么?我是否应该使用
Optional.ofNullable().orElse()
而不是
ObjectUtils.defaultIfNull

如果您不想调用
createNewCustomer(supportParam)
则可以使用
Optional.ofNullable(getCustomerByAddressID(sourceData,supportParam)).orelsGet(()->->createNewCustomer(supportParam))
,即使
getCustomerByAddressID(sourceData,supportParam)
null

您也应该使用

target = ObjectUtils.defaultIfNull(getCustomerByAddressID(sourceData, supportParam),
                    createNewCustomer(supportParam));

因为可选的.ofNullable().orElse()和ObjectUtils.defaultIfNull()在内部使用三元运算符,所以始终调用“orElse”部分。

createNewCustomer(supportParam)
被执行,因为您在调用
defaultIfNull
时调用它。谢谢@Lino。我假设同样的行为也适用于
Optional.ofNullable(getCustomerByAddressID(sourceData,supportParam)).orElse(createNewCustomer(supportParam))
,不是;没错,你可以使用
orElseGet(()->createNewCustomer(supportParam))这样,它只在真正需要时执行
target = Optional.ofNullable(getCustomerByAddressID(sourceData, supportParam))
.orElseGet(() -> createNewCustomer(supportParam));