Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Callable而不是Supplier,反之亦然_Java_Java 8_Callable_Functional Interface_Supplier - Fatal编程技术网

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
可以抛出
异常
,而
供应商
只能抛出未选中的异常。