我想使用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方式?谢谢!!!
答案 0 :(得分:4)
我们从Optional<Service>
平面地图开始,到Optional<ServiceResponse>
(使用常规地图功能会给我们Optional<Optional<ServiceResponse>>
),然后将其映射到Optional<Boolean>
。
Optional<Boolean>
表示响应成功或失败。如果我们在这里没有值,则抛出异常,因此我们使用orElse(false)
返回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;
}
})