为什么 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 的主体将永远不会被执行。