使用选项重写服务请求

时间:2017-12-15 10:02:39

标签: java java-8 optional

我想使用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方式?谢谢!!!

1 个答案:

答案 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;
     }
 })