选择一个而不是另一个的概念差异在于它们的文档中所解释的。这取决于API使用者的方法来选择哪一个对他们有效地使用。
Optional
是一个容器对象,可能包含或不包含非空值。
类型为 Optional
的变量本身不应为 null
;它应该始终指向一个 Optional
实例。
这是一个基于值的类;对 Optional 实例进行身份敏感操作(包括引用相等性(==)、标识哈希码或同步)可能会产生不可预测的结果,应避免使用。
因此,以下是行为:
String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"
同样遍历它
String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null
Objects
是一个类,由静态实用方法组成,用于操作对象或在操作之前检查某些条件。
这些实用程序包括对空值安全或容忍空值的方法,用于计算对象的哈希码、返回对象的字符串、比较两个对象以及检查索引或子范围值是否越界。
因此,行为上的差异在于:
String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");
这进一步在内部评估是否 requireNonNull("nonNull", "defaultObj")
,然后
=> returns "nonNull" since its a non-null value
现在它遍历
String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);
它内部会检查
requireNonNull(bar, "defaultObj")
,然后...
=> throws a NullPointerException
正如所记录的那样
throws NullPointerException
- 如果 obj 和 defaultObj 都为 null
Optional.ofNullable().orElse()
和Objects.requireNonNullElse()
之间在分配方面没有区别。 - ZhekaKozlovfoo
是null
时,ofNullable()
才会返回常量 empty 实例。你试过用非空的foo
进行 JMH 测试吗?因为我认为这个问题是在问两者之间的函数差异是什么,对于 任何 值,而不仅仅是null
值。 - Andreasfoo
。当该方法处于热状态时,分配速率将降至零。 - ZhekaKozlov