我遇到了使用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
}
答案 0 :(得分:2)
我没有看到产生使用Callable的任何线程。但这是 可以使用Callable代替Supplier。
正如评论中所提到的,Callable
和Supplier
都是具有相同功能描述符的接口,即其SAM(单一抽象方法)的签名相同。
一个区别是Callable#call
可以引发检查的异常,而另一方面Supplier#get
则不能。
这意味着对于您的用例,使用它们中的任何一个都是完全可以接受的,尽管如this answer
中所述尽管在这种特定情况下两个接口都足以满足不同的目的,即Callable是“返回结果的任务”,而Supplier是“结果的提供者”。相对于前者,后者更“一般”。
因此,结论是选择最适合您的特定情况的
。