init对象内联并作为参数传递 - java

时间:2017-04-19 08:07:02

标签: java java-8

为什么orElse每次都被执行,即使它不应该? 我在这做错了什么?我还在学java:)

 Optional.ofNullable(myVar)
          .orElse(Optional.ofNullable(myVar = ...)))
                .orElseThrow(MyException::new))

2 个答案:

答案 0 :(得分:4)

使用orElseGet()。它接受Supplier,只有在需要时才会调用它。例如。

Optional.ofNullable(myVar)
      .orElseGet(() -> Optional.ofNullable(myVar = ...)))
            .orElseThrow(MyException::new))

澄清:评估您提供给orElse()的参数,但不调用orElse()本身。这是您案件中的副作用,如果您希望将其执行延迟到需要时,则应使用orElseGet()

答案 1 :(得分:1)

  xplain我首先为什么? - Ckkn

方法orElse()期望在执行方法调用之前必须创建的对象。如果Nullable的内容实际为null,则会返回此(已存在的)对象。

方法orElseGet()也需要现有对象,但此对象本身不会返回。期望的对象是Supplier类型,当Nullable的内容实际为null时,它有一个要调用的方法。 这样,每次调用orElseGet()时都可以避免创建值对象。但是你"买"这可以通过创建Supplier对象来实现。另一方面,Supplier对象可以很容易地成为实例成员或常量......