【问题标题】:Scala Option.orElse equivalent for Java OptionalScala Option.orElse 等效于 Java 可选
【发布时间】:2016-01-29 11:01:32
【问题描述】:

Option 定义了以下方法:

def orElse[B >: A](alternative : => scala.Option[B]) : scala.Option[B]

我试图在 Java 8 中找到类似的东西。我想到了这个表达式:

private String userId() {
        return user.map(User::getUsername)
                .orElse(this.userId.orElseThrow(RuntimeException::new));
    }

useruserId 都是 Optional 的,但不知何故,即使定义了 user,这也会与 RuntimeException 一起崩溃。 在 Java 中是否有比在 Optional 上创建条件更实用的功能?

【问题讨论】:

    标签: java scala functional-programming monads optional


    【解决方案1】:

    您正在寻找的是 Java 9 中引入的 Optional.or 方法:

    public Optional<T> or​(Supplier<? extends Optional<? extends T>> supplier)
    

    【讨论】:

      【解决方案2】:

      使用orElseGet:

      private String userId() {
          return user.map(User::getUsername)
                  .orElseGet(() -> this.userId.orElseThrow(RuntimeException::new));
      }
      

      当你使用普通的orElse时,它的参数是在orElse本身执行之前执行的,所以orElse只能返回它,但不能决定是否执行。使用 orElseGet 创建一个 lambda,它仅在 Optional 为空时执行。

      【讨论】:

      • 它不返回可选的返回 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2012-01-07
      • 1970-01-01
      • 2016-08-29
      相关资源
      最近更新 更多