Java 8中Optional类的ofNullable方法输出的差异

时间:2017-05-31 18:31:54

标签: java java-8

当我按预期运行下面的代码片段时,我得到Optional.empty

   //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)

我原以为它会为第二个例子返回一个Optional.empty。任何人都可以解释我为什么会这样做。

3 个答案:

答案 0 :(得分:0)

首先,让我们回顾一下ofNullable的用法。

  

ofNullable返回描述指定值if的Optional   非null,否则返回一个空的Optional。

Optional<T> 类型旨在作为类型T的引用的更安全的替代方法,该引用既可以引用对象,也可以为null,并且您违反此规则

当您执行1 / doubleNull作为ofNullable方法的参数时,您基本上将doubleNull拆箱到原始double类型,该类型会抛出异常,因此根本没有调用ofNullable

答案 1 :(得分:0)

如果您希望获得Optional.empty,也许您想要的是在您的可空座位上拨打map

Double dbNull = null;
Optional nullableOptional = Optional.ofNullable( dbNull );
Optional inverseOptional = nullableOptional.map(x -> 1/x);

此处inverseOptional将为empty。另一方面,如果nullableOptional持有某个值,那么inverseOptional将保持相反的值。

使用组合方法map是安全保护自己免受NullPointerException

的正确方法

答案 2 :(得分:0)

由于Optional#ofNullable引发null.doubleValue(),因此在第二种情况下,NullPointerException语句永远不会运行。当对包装器类型Double进行一些数学运算时,编译器会将包装器类型自动解包为原始类型double

//      your code is same as below but it done by compiler ---v
Optional nullableOptional1 = Optional.ofNullable( 1/doubleNull.doubleValue());

您可以使用Optional#map来实现自己的方式,例如:

Optional nullableOptional1 = Optional.ofNullable(doubleNull).map(it->1/it);
//                                                                 |
//                                                                 |
// Notes: if the value is absent, the provided mapping function is never called