使用 Callable 而不是 Supplier,反之亦然

Using Callable instead of Supplier or vice versa

我遇到了使用 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
}

I did not see any threads spawning across to use Callable. But is it okay to use Callable instead of Supplier.

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

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

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

中所述

尽管在这种特定情况下这两个接口都足够了,但它们用于不同的目的,即 Callable 是 "A task that returns a result" 而 Supplier 是 "a supplier of results"。后者比前者更 "general"。

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