java - 使用可选项重写服务请求

标签 java java-8 option-type

我想使用 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/

相关文章:

java - 链接 Observable 和发射/传递原始发射到订阅调用

java - 指定elasticsearch的JDK路径

ios - 为什么这个变量是 "nil",即使我有一个 "if"语句检查它不是

java-8 - 在 Java8 中对 else 条件使用相同的流

java - 如何在lambda表达式(JAVA)中使用try catch?

java - 我应该在我的包装类中使用 Java 8 的 Optional 还是在不使用某些属性时使用 null?

java - 如何引用用户使用 Scanner 输入的最后一个值?

java - 每周创建一个文件

java - import class.1 是什么意思?

java - JDK8 - 尝试使用 Maven javadoc 插件生成 javadoc 时出现错误 "class file for javax.interceptor.InterceptorBinding not found"