gpt4 book ai didi

java - Optional.ofNullable() 和 `Optional.of() 有什么区别

转载 作者:行者123 更新时间:2023-12-05 00:51:29 25 4
gpt4 key购买 nike

首先,我知道这两种方法的区别。

  • Optional.of : 用于保证不存在null,如果输入null,nullPointExcepction

  • Optional.ofNullable :可能为空,也可能不为空。用于灵活应对。

那么,如果我将 orElseThrow(() -> new NullPointerException("null data")) 添加到这个,它最终会是一样的吗?

我想抛出带有显式内容的错误。

所以我得到 Optional.ofNullable(data).orElseThrow(() -> new NullPointerException("null data")))

将其用作这是无意义的行为吗?

Optional.of(data).orElseThrow(() -> new NullPointerException("null data")))

我觉得这也是可以的,不过我只是用ofNullable()来让代码看起来一致。

总结一下,最后,如果添加 orElseThrow(nullPoint)ofofNullable 结果一样吗?

不如说of.orElseThrow 更好吗?

最佳答案

to sum it up, In the end, if you add orElseThrow(nullPoint) Are of or ofNullable the same result?

没有。要查看这一点,只需查看类型即可。

public static <T> Optional<T> of(T value);

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
throws X extends Throwable;

Optional.of返回 Optional<T> , 其中 orElseThrow会给你留下一个T .所以Optional.ofNullable(x).orElseThrow(...)真的只是一个非常迂回的路口

if (x == null) {
throw new NullPointerException(...);
}

你实际上并没有任何事情,Optional ,只需制作一个并以非常冗长的方式丢弃它。因此,如果这是您的意图,只需执行明确的 null查看;根本不需要Optional .

这引发了我们为什么要使用 of 的问题。或 ofNullable .随着Optional的介绍,现在有两种方法可以在 Java 中表示“此值可能不存在”的概念:nullOptional.empty() .互联网上的人们会争论到底哪个更好,什么时候应该使用哪个(我对此有强烈的意见,我不会在这里分享,因为这不是你问的),但重点是有两种不同的方法可以做到这一点。

对于本文的其余部分,我将借用 Kotlin 的一些符号并写成 T?表示“可能是 Tnull 值”。它不是有效的 Java 表示法,但它明白了这一点。因此,如果我们想在 Java 中表示“A T 可能存在也可能不存在”,我们可以使用 Optional<T>T? .

如果我们想从 T? 出发至Optional<T> ,这就是Optional.ofNullable是为了。它说“如果东西是 null ,给我 Optional.empty() ;否则给我 Optional 中的东西”。反过来,我们可以使用 Optional.orElse(null) ,上面写着“如果我有 T ,给我,否则给我看 null ”。所以现在我们有一种方法可以在这两种方法之间进行转换。那么 Optional.of 是什么?为了?

您应该查看 Optional.of作为某种断言。如果 Java 有像 Kotlin 这样的可空类型,那么区别将类似于

public static <T> Optional<T> of(T value);
public static <T> Optional<T> ofNullable(T? value);

也就是说,ofNullable期望它的值可能是 null . of已经假设它不是。 Optional.of应该考虑一个断言,即您给它的值不为空。如果该断言失败,我们抛出 NullPointerException立即而不是让错误传播到程序的其他部分。如果您调用 Optional.of并从 NullPointerException 中恢复它抛出[1],那么你做的事情非常错误。该函数是一个我们开始处理非空数据的断言,如果该断言失败,那么您的程序应该立即失败并显示良好的堆栈跟踪。

听起来,根据您的用例,您的值可能是 null .在这种情况下,Optional.ofNullable说得通;它已准备好处理用例。如果你想抛出一个自定义异常,你应该事先做一个空检查(因为 你是处理 null 的人,而不是 Optional )然后调用 Optional.of .或者,当然,你可以做一个老式的 null检查而不使用Optional无论如何,如果你打算用 orElseThrow 提取它.当然,管道Optional.ofNullable(value).orElseThrow(...)一行会是代码味道。


[1] 请注意,我说的是“恢复”,而不是“捕获”。一个不错的顶级catch (Exception exc)记录所有错误是完全可以接受的,并且在大型应用程序中通常是一个好主意。但是如果你在做 catch (NullPointerException exc) { return 0; }或类似的东西,那么你需要重新考虑哪个 Optional您应该使用的方法。

关于java - Optional.ofNullable() 和 `Optional.of() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71835972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com