Java 使用Callable而不是Supplier,反之亦然
我遇到了使用Java 使用Callable而不是Supplier,反之亦然,java,java-8,callable,functional-interface,supplier,Java,Java 8,Callable,Functional Interface,Supplier,我遇到了使用Callable而不是Supplier的代码。我没有看到任何使用Callable的线程。但是可以使用可调用而不是供应商 与我一起工作的一位开发人员表示,它也做同样的工作。根据文件,它不知道,但想知道这里的专家意见 Callable<Optional<NodePermissionResponse>> successHandler = () -> { NodePermissionResponse restResponse = respon
Callable
而不是Supplier
的代码。我没有看到任何使用Callable
的线程。但是可以使用可调用而不是供应商
与我一起工作的一位开发人员表示,它也做同样的工作。根据文件,它不知道,但想知道这里的专家意见
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);
}
Callable successHandler=()->{
NodePermissionResponse response=response.readEntity(NodePermissionResponse.class);
返回可选。of(response);
};
可调用的errorHandler=()->{
ApplicationResponse appResponse=response.readEntity(ApplicationResponse.class);
如果(appResponse.getError().getStatusCode()==未找到状态代码){
返回可选的.empty();
}
log.error(“获取组的权限失败”,appResponse.getError());
抛出新的ApplicationAccessException(appResponse.getError());
};
返回进程响应(
successHandler、errorHandler、response);
}
处理响应的方法
public static <T> T processResponse(Callable<T> successfulResponseHandler,
Callable<T> unsuccesfulResponseHandler,
Response response) {
//do the job here
}
public static T processResponse(可调用的successfulResponseHandler,
可调用的未成功FullResponseHandler,
回应(回应){
//在这里工作
}
我没有看到任何线程使用Callable生成。但这是真的吗
可以使用Callable而不是Supplier
如注释中所述,Callable
和Supplier
都是具有相同功能描述符的接口,即它们的SAM(单一抽象方法)在签名中是相同的
一个区别是,Callable#call
能够抛出选中的异常,另一方面,Supplier#get
则不能
这意味着对于您的用例来说,使用它们中的任何一个都是完全可以接受的,尽管如中所述
虽然这两个接口在这种特定情况下都足够,但它们的用途不同,即可调用的是“返回结果的任务”,而供应商是“结果的供应商”。与前者相比,后者更具“一般性”
因此,结论是使用最适合您特定场景的接口。Callable
只是一个接口。同样,供应商
只是一个接口。唯一的区别是,Callable.call()
允许抛出已检查的异常,而Supplier.get()
则不允许。一切都取决于具体情况,Callable
和Supplier
都是功能接口,因此在某些情况下它们是可替换的,但是请注意,Callable
可以抛出异常
,而供应商
只能抛出未选中的异常。