可选与三元运算符

时间:2019-10-14 22:41:23

标签: java oop java-stream refactoring

假设我们有这个先决条件,并且具有类定义:

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服务获取的值的优先级来加载结果。

我想在这里说出您的观点,让我们讨论一下这两行中哪一条更易读?

方法A(使用可选)

String result = ObjectUtils.firstNonNull(name, Optional.ofNullable(someComp).map(SomeComponent::getName).orElse(null));

方法B(使用三元运算符)

String result = ObjectUtils.firstNonNull(name, someComp != null ? someComp.getName() : null);

不确定Optional是否给您带来混乱!?我一直在尝试使用它们,有时会失去一线的指南针。可能这也很愚蠢,但我很好奇您的想法是什么?

2 个答案:

答案 0 :(得分:1)

我认为我喜欢方法B。我认为它比方法A更具可读性。也就是说,如果您了解三元运算符。

此外,如果您可以将该三元语句包含在一组()中,则会使代码更具可读性。

此外,我认为方法B的速度将比方法A快得多。您应该对它们进行基准测试。

答案 1 :(得分:0)

如果您控制着fetchFromDatastorefetchNameFromWebService,那么我会说,首先返回null是一种老式的做法,您应该考虑将它们升级为返回的Optional,因为正是这些情况引入了Optional的原因。例如,Spring's repository使用Optional

Optional<T> findById(ID primaryKey);

如果fetchFromDatastorefetchNameFromWebService都返回了Optional,那么,不仅可以降低NPE的风险,而且可以使用Java9的or来简单地做到这一点:

String result = fetchFromDatastore(123)
                               .or(()->fetchNameFromWebService(123))
                               .orElse("");

or仅在必要时执行。当然,这些or可以根据需要进行链接。

Java8无疑是a bit more cumbersome