我对“可选”的概念很陌生。在下面发布的代码中,我正在检查以下内容:
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
答案 0 :(得分:1)
我不建议您在此处使用Optional,因为这并不意味着 替换简单的“如果”案例。
相反,反转if
条件以删除嵌套:
if (!operation_1)
throw_1;
if(!operation_2)
throw_2;
if(! operation_3)
trow_3;
...
...
对于您的代码,您不能仅按如下所示链接orElseThrow
方法,因为对orElseThrow
的第一次调用将返回封装在Optional中的值(如果存在),否则将抛出提供的异常,因此此操作的结果方法调用不再是Optional
。