【问题标题】:Optional vs ternary operator [closed]可选与三元运算符[关闭]
【发布时间】:2019-10-14 22:41:23
【问题描述】:

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

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 是通过网络服务填充的,它也可以是null。 结果应该以从 Web 服务获取的值的优先级加载。

我希望您在这里发表您的意见,让我们讨论一下这两行中哪一行更具可读性?

方法 A(使用 Optional)

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 是否给您带来了困惑!?我一直在尝试使用它们,有时会因为单线而失去指南针。也许,这也可能是愚蠢的,但我很好奇你的想法是什么?

【问题讨论】:

  • 就个人而言,我发现使用Optional 以外的返回类型是“错误的”。但是,您或其他人是否同意我的观点取决于主观原因,因此您的问题可能会被关闭为“主要基于意见”。
  • 当有两个可空级别时,差异变得更加明显; Optional.ofNullable(someComp).map(SomeComponent::getSubComponent).map(SomeSubComponent::getName).orElse(null)someComp != null ? (someComp.getSubComponent() != null ? someComp.getSubComponent().getName() : null) : null

标签: java oop java-stream refactoring


【解决方案1】:

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

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

除此之外,我相信方法 B 会比方法 A 快得多。您应该对它们进行基准测试。

【讨论】:

    【解决方案2】:

    如果您控制fetchFromDatastorefetchNameFromWebService,那么我会说首先返回nulls 是旧式做法,您应该考虑将它们升级为返回@987654326 @,因为这些场景正是引入 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2020-06-22
      • 2020-04-14
      • 2015-02-15
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多