无法解析可选对象的orElseThrow

时间:2018-12-14 13:08:22

标签: java android java-8 optional

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

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

1 个答案:

答案 0 :(得分:1)

我不建议您在此处使用Optional,因为这并不意味着 替换简单的“如果”案例。

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

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

...  
...

对于您的代码,您不能仅按如下所示链接orElseThrow方法,因为对orElseThrow的第一次调用将返回封装在Optional中的值(如果存在),否则将抛出提供的异常,因此此操作的结果方法调用不再是Optional