- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我知道这两种方法的区别。
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)
of
和 ofNullable
结果一样吗?
不如说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 中表示“此值可能不存在”的概念:null
和 Optional.empty()
.互联网上的人们会争论到底哪个更好,什么时候应该使用哪个(我对此有强烈的意见,我不会在这里分享,因为这不是你问的),但重点是有两种不同的方法可以做到这一点。
对于本文的其余部分,我将借用 Kotlin 的一些符号并写成 T?
表示“可能是 T
的 null
值”。它不是有效的 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/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!