Java8中可选类的可调用方法输出的差异
当我按预期运行下面的代码段时,我得到Optional.emptyJava8中可选类的可调用方法输出的差异,java,java-8,Java,Java 8,当我按预期运行下面的代码段时,我得到Optional.empty //Example 1 Double dbNull = null; Optional nullableOptional = Optional.ofNullable( dbNull ); System.out.println(nullableOptional); 但是当我运行下面的代码片段时 //Example 2 Double doubleNull = null; Optio
//Example 1
Double dbNull = null;
Optional nullableOptional = Optional.ofNullable( dbNull );
System.out.println(nullableOptional);
但是当我运行下面的代码片段时
//Example 2
Double doubleNull = null;
Optional nullableOptional1 = Optional.ofNullable( 1/doubleNull );
System.out.println(nullableOptional1);
我明白了
Exception in thread "main" java.lang.NullPointerException
at com.main.java8.streams.CreatingOptionalValuesDemo.main(CreatingOptionalValuesDemo.java:30)
我希望第二个示例也会返回可选的.empty。谁能解释一下它为什么会这样做。首先,让我们回顾一下的用法 如果需要,返回描述指定值的可选值 非null,否则返回空的可选值 类型是指引用对象或为空的
T
类型引用的更安全的替代方法,您正在违反此规则
当您将
1/doubleNull
作为方法的参数执行时,实际上是将doubleNull
解封为一个基本double
类型,该类型会引发异常,因此根本不会调用 如果您希望得到一个可选的.empty
,那么您可能需要在您的可空文件上调用map
:
Double dbNull = null;
Optional nullableOptional = Optional.ofNullable( dbNull );
Optional inverseOptional = nullableOptional.map(x -> 1/x);
这里的inverseOptional
将为空
。另一方面,如果nullableOptional
持有某个值,那么inverseOptional
将持有该值的倒数
使用combinator方法
map
是安全保护自己免受NullPointerException
在第二种情况下,由于null.doubleValue()
引发NullPointerException
,因此在第二种情况下根本不会运行Optional>语句。当对包装器类型Double
执行一些数学运算时,编译器将自动将包装器类型取消装箱为原始类型Double
// your code is same as below but it done by compiler ---v
Optional nullableOptional1 = Optional.ofNullable( 1/doubleNull.doubleValue());
您可以使用来实现您的目标,例如:
Optional nullableOptional1 = Optional.ofNullable(doubleNull).map(it->1/it);
// |
// |
// Notes: if the value is absent, the provided mapping function is never called
与optionals无关:除此之外:您通过省略参数使用原始类型。永远不要那样做。首先关注基础知识。并支付有关异常消息的更多详细信息。他们会告诉你问题到底发生在哪里。