假设我们有这个先决条件,并且具有类定义:
class SomeComponent {
private String name;
public String getName(){
return this.name;
}
}
从数据存储区获取实例someComp
的情况下,它可以是null
// someComp and name can be null
SomeComponent someComp = fetchFromDatastore(123);
String name = fetchNameFromWebService(123);
变量name
是通过Web服务填充的,也可以是null
。
应该使用从Web服务获取的值的优先级来加载结果。
我想在这里说出您的观点,让我们讨论一下这两行中哪一条更易读?
String result = ObjectUtils.firstNonNull(name, Optional.ofNullable(someComp).map(SomeComponent::getName).orElse(null));
String result = ObjectUtils.firstNonNull(name, someComp != null ? someComp.getName() : null);
不确定Optional
是否给您带来混乱!?我一直在尝试使用它们,有时会失去一线的指南针。可能这也很愚蠢,但我很好奇您的想法是什么?
答案 0 :(得分:1)
我认为我喜欢方法B。我认为它比方法A更具可读性。也就是说,如果您了解三元运算符。
此外,如果您可以将该三元语句包含在一组()中,则会使代码更具可读性。
此外,我认为方法B的速度将比方法A快得多。您应该对它们进行基准测试。
答案 1 :(得分:0)
如果您控制着fetchFromDatastore
和fetchNameFromWebService
,那么我会说,首先返回null
是一种老式的做法,您应该考虑将它们升级为返回的Optional
,因为正是这些情况引入了Optional
的原因。例如,Spring's repository使用Optional
:
Optional<T> findById(ID primaryKey);
如果fetchFromDatastore
和fetchNameFromWebService
都返回了Optional
,那么,不仅可以降低NPE的风险,而且可以使用Java9的or
来简单地做到这一点:>
String result = fetchFromDatastore(123)
.or(()->fetchNameFromWebService(123))
.orElse("");
or
仅在必要时执行。当然,这些or
可以根据需要进行链接。
Java8无疑是a bit more cumbersome