java - 可选对象的 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
解决方案
我不建议在这里使用 Optional ,因为它并不是要替换简单的“if”案例。
相反,反转if
条件以删除嵌套:
if (!operation_1)
throw_1;
if(!operation_2)
throw_2;
if(! operation_3)
trow_3;
...
...
至于您的代码,您不能只链接orElseThrow
所示的方法,因为第一次调用orElseThrow
将返回封装在 Optional 中的值(如果存在),否则会引发提供的异常,因此此方法调用的结果不再是Optional
.
推荐阅读
- javascript - 从“navigationStart”开始时,性能用户计时 API 测量无法正常工作
- java - JAVA:mouseDragged getX 和 getY 原始数据不稳定
- bash - 如何找到当天登录的用户并提及他们登录的时间?
- swift - Swift 使用 Scrollview 重新创建 iPhone App Switcher 页面
- php - PHP 输出 HTML,更好的方法?
- node.js - 如何在 Node JS 中截取整个屏幕的屏幕截图?
- javascript - 使用 React Hooks 隐藏点击按钮
- javascript - 反应按钮,使用tone.Js,在第一次按键后中断,错误:setValueAtTime 的参数无效:{},2.2188208616780045
- github - Github:如何列出创建了 Private Access Tokens 的组织成员?
- c# - 拆分字段字符串并将每个值与字符串 linq c# 进行比较