Dav*_*ica 5 java null nullable optional java-9
Java 9向该类介绍了方法requireNonNullElse和requireNonNullElseGet方法Objects.这些Optional.ofNullable() orElse()和orElseGet()方法在功能上有什么不同吗?
String foo = null;
Objects.requireNonNullElse(foo, "nonNull");//returns the string "nonNull"
Optional.ofNullable(foo).orElse("nonNull");//also returns the string "nonNull"
Run Code Online (Sandbox Code Playgroud)
如果他们没有功能差异,为什么Objects现在添加一个?
他们的行为有一个细微的差别.Objects.requireNonNullElse()要求其中一个参数为非null,否则NullPointerException抛出a.
String foo = null, bar = null;
Optional.ofNullable(foo).orElse(bar);//returns a null value
Objects.requireNonNullElse(foo, bar);//throws a NullPointerException
Run Code Online (Sandbox Code Playgroud)
选择一种而不是另一种之间的概念差异如其文档中所述。它依赖于 API 使用者的方法来选择他们应该有效使用其中哪一个。
Optional是容器对象,可能包含也可能不包含非空值。
类型为 的变量
Optional本身不应该是null; 它应该始终指向一个Optional实例。这是一门以价值观为基础的课程;在Optional实例上使用身份敏感操作(包括引用相等(==)、身份哈希码或同步)可能会产生不可预测的结果,应避免。
Optional如果指定值非空,则返回当前值,否则返回空Optional
如果存在则返回该值,否则返回 other。
因此出现以下行为:
String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"
Run Code Online (Sandbox Code Playgroud)
和它遍历的一样
String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null
Run Code Online (Sandbox Code Playgroud)
Objects
是一个由静态实用方法组成的类,用于对对象进行操作,或在操作之前检查某些条件。
这些实用程序包括空安全或空容忍方法,用于计算对象的哈希码、返回对象的字符串、比较两个对象以及检查索引或子范围值是否越界。
如果第一个参数非空,则返回;否则,如果第二个参数非空,则返回
因此行为上的差异:
String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");
Run Code Online (Sandbox Code Playgroud)
进一步内部评估 ifrequireNonNull("nonNull", "defaultObj")和 then
=> returns "nonNull" since its a non-null value
Run Code Online (Sandbox Code Playgroud)
现在当它穿过
String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);
Run Code Online (Sandbox Code Playgroud)
它在内部检查 if requireNonNull(bar, "defaultObj")which then
=> throws a NullPointerException
Run Code Online (Sandbox Code Playgroud)
正如记录的那样
throws NullPointerException- 如果 objnull和defaultObj 都为null