2017-04-19 58 views

回答

4

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

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

澄清:您提供给orElse()参数进行评估,但orElse()本身不叫。这是你的情况的一个副作用,如果你想延迟它的执行时间,你应该使用orElseGet()

+0

解释我请第一whyyy ??? – Ckkn

+0

为什么是副作用?编译器中的错误还是什么?请解释我,我想知道为什么在进一步编程时能够避免这些副作用 – Ckkn

+1

Java在调用所述方法之前评估方法参数。在你的情况下,你提供了一个'orElse()'的参数,并且java高兴地评估了为方法调用做准备。所以即使没有调用'orElse()',你传递给'orElse()'的参数也会被评估。 – Justas

1

xplain我请第一whyyy ??? - Ckkn

方法orElse()需要在方法调用执行前必须创建的对象。如果Nullable的内容实际上是null,则返回此(已存在)对象。

方法orElseGet()还预计现有的对象,但这种对象不返回本身。预期的对象类型为Supplier,当Nullable的内容实际上是null时,该对象具有调用的单个方法。 这样可以避免每次调用orElseGet()时创建您的值对象。但是你通过创建一个Supplier对象来“购买”这个对象。在另一方面,Supplier对象很容易被一个实例成员或常量...

+0

aaahh该死的,我明白了,谢谢 – Ckkn