为什么orElse每次都被执行,即使它不应该? 我在这做错了什么?我还在学java:)
Optional.ofNullable(myVar)
.orElse(Optional.ofNullable(myVar = ...)))
.orElseThrow(MyException::new))
答案 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
对象可以很容易地成为实例成员或常量......