2

我遇到了使用Callable而不是Supplier. 我没有看到任何线程产生使用Callable。但是可以使用Callable代替Supplier吗?

与我一起工作的一位开发人员说它做同样的工作。通过文档,它不会但想在这里了解专家的意见。

  Callable<Optional<NodePermissionResponse>> successHandler = () -> {
        NodePermissionResponse restResponse = response.readEntity(NodePermissionResponse.class);
        return Optional.of(restResponse);
    };

    Callable<Optional<NodePermissionResponse>> errorHandler = () -> {
        ApplicationResponse appResponse = response.readEntity(ApplicationResponse.class);
        if(appResponse.getError().getStatusCode() == NOT_FOUND_STATUS_CODE) {             
            return Optional.empty();
        }
        log.error("Fetching entitlements for group failed", appResponse.getError());                                            
        throw new ApplicationAccessException(appResponse.getError());
    };

 return processResponse(
            successHandler, errorHandler, response);
}

处理响应的方法

  public static <T> T processResponse(Callable<T> successfulResponseHandler,
                             Callable<T> unsuccesfulResponseHandler,
                             Response response) {
   //do the job here
}
4

1 回答 1

2

我没有看到任何线程产生使用 Callable。但是可以使用 Callable 代替 Supplier 吗?

正如评论中已经提到的,两者Callable都是Supplier具有相同函数描述符的接口,即它们的 SAM(单一抽象方法)在它们的签名中是相同的。

一个区别是,Callable#call能够抛出已检查的异常,另一方面Supplier#get则不能。

这意味着对于您的用例,使用它们中的任何一个都是完全可以接受的,尽管如本答案所述

尽管在这种特定情况下这两个接口都足够了,但它们用于不同的目的,即 Callable 是“返回结果的任务”,而 Supplier 是“结果的提供者”。与前者相比,后者更“通用”。

因此,结论是选择最适合您的特定场景的那个。

于 2018-12-11T17:31:24.210 回答