使用 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.
正如评论中提到的,Callable
和 Supplier
都是具有相同函数描述符的接口,即它们的 SAM(单一抽象方法)在它们的签名中是相同的。
一个区别是,Callable#call
能够抛出已检查的异常,而 Supplier#get
则不能。
这意味着对于您的用例,使用它们中的任何一个都是完全可以接受的,尽管如 this answer
中所述
尽管在这种特定情况下这两个接口都足够了,但它们用于不同的目的,即 Callable 是 "A task that returns a result" 而 Supplier 是 "a supplier of results"。后者比前者更 "general"。
所以,结论是选择最适合您的特定场景的那个。
我遇到了使用 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
都是具有相同函数描述符的接口,即它们的 SAM(单一抽象方法)在它们的签名中是相同的。
一个区别是,Callable#call
能够抛出已检查的异常,而 Supplier#get
则不能。
这意味着对于您的用例,使用它们中的任何一个都是完全可以接受的,尽管如 this answer
中所述尽管在这种特定情况下这两个接口都足够了,但它们用于不同的目的,即 Callable 是 "A task that returns a result" 而 Supplier 是 "a supplier of results"。后者比前者更 "general"。
所以,结论是选择最适合您的特定场景的那个。