我想使用 Optionals 重写下面的代码(我不控制 jpaConnector ):
public boolean deleteLockStatus() {
IMdss service = jpaConnector.getMdssService();
if ( service == null ) {
return false;
}
ServiceResponse response = null;
try {
response = service.deleteLockStatus();
} catch (Exception e) {
e.printStackTrace();
}
if ( response == null ) {
return false;
}
if ( response.isError() ) {
return false;
}
return true;
}
到目前为止我已经做到了:
public boolean deleteLockStatus() {
Optional<IMdss> service = Optional.ofNullable(jpaConnector.getMdssService());
if (!service.isPresent()) { return false; }
Optional<ServiceResponse> response = Optional.empty();
try {
response = Optional.ofNullable(service.get().deleteLockStatus());
if ( response.isPresent() == false || response.get().isError() ) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
是否有更好更原生的 java 8 方式?谢谢!!!
最佳答案
我们从 Optional<Service>
开始,将其平面映射到 Optional<ServiceResponse>
(使用常规映射函数会给我们 Optional<Optional<ServiceResponse>>
),然后将其映射到 Optional<Boolean>
.
Optional<Boolean>
表示响应成功或失败。如果这里没有值,则会抛出异常,因此我们返回 false orElse(false)
.
检查异常和必须打印堆栈跟踪是一种耻辱,否则它可能会更简洁。
public boolean deleteLockStatus() {
return Optional.ofNullable(jpaConnector.getMdssService())
.flatMap(service -> {
try {
return Optional.ofNullable(service.deleteLockStatus());
}
catch(Exception e) {
e.printStackTrace();
return Optional.empty();
}
})
.map(ServiceResponse::isError)
.orElse(false);
}
旁注:catching Exception
is usually a bad idea .你应该尽可能具体。考虑使用 this syntax如果有多个可能的异常可能被抛出。
如 Federico 的评论中所述, 你可以替换 flatMap
如果您不介意使用 null
,可以稍微简化一下.我个人更喜欢上面的版本。
.map(service -> {
try {
return service.deleteLockStatus();
}
catch(Exception e) {
e.printStackTrace();
return null;
}
})
关于java - 使用可选项重写服务请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47829898/