首页 > 解决方案 > 可选对象的 orElseThrow 无法解析

问题描述

我对可选的概念很陌生。在下面发布的代码中,我正在检查以下内容:

if (operation_1) {

    if (operation_2) {

        if (operation_3) {

        } else {
            throw_3
        }
    } else {
        throw_2
    }
} else {
    throw_1
}

但是对于此代码,android studio 会为“标记如下”的第二个 orElseThrow() 操作生成错误。请让我为什么会收到此错误?如何解决?我在下面写的代码是否满足上面显示的条件。

代码

OptionalsUtils.toOptional(Room.databaseBuilder(getApplicationContext(), MovieDatabase.class, ActMain.DATA_BASE_NAME))//operation_1
            .map(x->{
                MovieDatabase movieRoomDb = x.fallbackToDestructiveMigration().build();
                this.setInitializedBuiltMovieRoomDatabase(movieRoomDb);
                return movieRoomDb;
            })//operation_2
            .map(y->{
                SupportSQLiteOpenHelper openHelperInstance = y.getOpenHelper();
                this.setSQLOpenHelperInstance(openHelperInstance);
                return openHelperInstance;
            })//operation_3
            .orElseThrow(()-> new NullPointerException(THROW_SQL_OPEN_HELPER_NULL))//throw_3
            .orElseThrow(()-> new NullPointerException(THROW_ROOM_DATABASE_PERSISTENT_BUILD_NULL))//throw_2<-cases error
            .orElseThrow(()-> new NullPointerException(THROW_ROOM_DATABASE_PERSISTENT_BUILDER_NULL));//throw_1

标签: javaandroidjava-8optional

解决方案


我不建议在这里使用 Optional ,因为它并不是要替换简单的“if”案例。

相反,反转if条件以删除嵌套:

if (!operation_1) 
   throw_1;
if(!operation_2)
   throw_2;
if(! operation_3)
   trow_3;

...  
...

至于您的代码,您不能只链接orElseThrow所示的方法,因为第一次调用orElseThrow将返回封装在 Optional 中的值(如果存在),否则会引发提供的异常,因此此方法调用的结果不再是Optional.


推荐阅读