代码之家  ›  专栏  ›  技术社区  ›  Amrmsmb

get方法在可选项上不返回值

  •  2
  • Amrmsmb  · 技术社区  · 7 年前

    在下面的示例中,最初,this.mMyBoundServiceHandlerThread为null。我想初始化该对象,如图所示 代码贴在下面。

    执行代码时,我收到以下信息:

    java.util.NoSuchElementException: No value present
    

    请告诉我为什么。get()返回空值?

    :

    Optional<MyBoundServiceHandlerThread> s = Optionals.toOptional(this.mMyBoundServiceHandlerThread);
        s
                .map(x -> new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
                .orElse(new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this));
        s.get().start();
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Eran    7 年前

    应该是:

    s.map(x -> new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
     .orElse(new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
     .start();
    

    s Optional ,这么说 s.get() 可能引发异常。

    orElse 是提供一个默认值,如果 为空,但您没有使用该值执行任何操作。

    map 地图 忽略 . 您可以使用以下等效语句替换整个代码段:

    new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this).start();
    

    我认为那不是你想要的。

        2
  •  0
  •   Ousmane D.    7 年前

    请告诉我为什么。get()返回空值?

    this.mMyBoundServiceHandlerThread 是 null 因此,在调用时,返回的可选项具有缺席状态 .get()

    mMyBoundServiceHandlerThread 程序中的标识符。

    另一方面,Optional不应该用来替换“if”语句,我这样说是因为目前,您忽略了 map 确定为 x 因此,您最好进行重构,以便:

    MyBoundServiceHandlerThread result = null;
    if(this.mMyBoundServiceHandlerThread != null) 
        result = new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this)
    

    另外,请注意,在 orElse 与传递给 这种方法似乎不同寻常。如果要继续使用可选的,您可能需要研究一下。