我遇到了使用 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.
正如评论中已经提到的,Callable
和 Supplier
都是具有相同函数描述符的接口(interface),即它们的 SAM(单一抽象方法)的签名相同。
一个区别是,Callable#call
能够抛出已检查的异常,而 Supplier#get
则不能。
这意味着对于您的用例来说,使用其中任何一个都是完全可以接受的,尽管如 this answer 中所述。
虽然这两个接口(interface)在这种特定情况下都足够了,但它们的目的不同,即 Callable 是“返回结果的任务”,而供应商是“结果的提供者”。与前者相比,后者更加“普遍”。
因此,结论是选择最适合您的特定场景的方案。
关于java - 使用Callable代替Supplier,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53727305/