为什么 Java 中的 orElseThrow() 方法将 `Supplier` 作为参数而不是 `Exception`?
Why does the `orElseThrow()` method in Java take a `Supplier` as a parameter instead of an `Exception`?
为什么Java中的orElseThrow()
方法使用Supplier
而不是Exception
作为参数?这是问题,我找到的最佳答案在 here 中,说明
The overarching concept here is that by providing a method reference (or a function) it can be lazily initialized. No need to create Exception object if you don't need it. Create it only when you need it.
但是,我还是不明白。为什么对象的创建不能偷懒?
我们应该这样使用 orElseThrow()
:
anOptional.orElseThrow(() -> new Exception())
因为上面 而不是 立即创建一个 Exception
:只有当可选不存在时才会调用 Supplier
lambda,并且在那新异常将被实例化的时刻。另一方面,如果我们遇到这种情况:
anOptional.orElseThrow(new Exception())
异常将 总是 创建,即使存在可选的,也就是 。这就是为什么 orElseThrow
需要一个 Supplier<? extends X>
和 <X extends Throwable>
的原因,换句话说:一个没有参数的 lambda 表达式 returns 一个新的 Throwable
对象在被调用时.
我们说它是“惰性”的,因为 lambda 的主体只在真正需要它的最后一刻才被评估,但如果它永远不需要,lambda 的主体将永远不会被执行。
为什么Java中的orElseThrow()
方法使用Supplier
而不是Exception
作为参数?这是问题,我找到的最佳答案在 here 中,说明
The overarching concept here is that by providing a method reference (or a function) it can be lazily initialized. No need to create Exception object if you don't need it. Create it only when you need it.
但是,我还是不明白。为什么对象的创建不能偷懒?
我们应该这样使用 orElseThrow()
:
anOptional.orElseThrow(() -> new Exception())
因为上面 而不是 立即创建一个 Exception
:只有当可选不存在时才会调用 Supplier
lambda,并且在那新异常将被实例化的时刻。另一方面,如果我们遇到这种情况:
anOptional.orElseThrow(new Exception())
异常将 总是 创建,即使存在可选的,也就是 orElseThrow
需要一个 Supplier<? extends X>
和 <X extends Throwable>
的原因,换句话说:一个没有参数的 lambda 表达式 returns 一个新的 Throwable
对象在被调用时.
我们说它是“惰性”的,因为 lambda 的主体只在真正需要它的最后一刻才被评估,但如果它永远不需要,lambda 的主体将永远不会被执行。