java - 使用Callable代替Supplier,反之亦然

标签 java java-8 callable functional-interface supplier

我遇到了使用 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.

正如评论中已经提到的,CallableSupplier 都是具有相同函数描述符的接口(interface),即它们的 SAM(单一抽象方法)的签名相同。

一个区别是,Callable#call 能够抛出已检查的异常,而 Supplier#get 则不能。

这意味着对于您的用例来说,使用其中任何一个都是完全可以接受的,尽管如 this answer 中所述。

虽然这两个接口(interface)在这种特定情况下都足够了,但它们的目的不同,即 Callable 是“返回结果的任务”,而供应商是“结果的提供者”。与前者相比,后者更加“普遍”。

因此,结论是选择最适合您的特定场景的方案。

关于java - 使用Callable代替Supplier,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53727305/

相关文章:

java - 解析 ISO_INSTANT 和类似的日期时间字符串

java - 在Java的synchronizedList中使用break和return会执行不需要的行为

java - 如何在一行中通过特定属性对象Java8将arraylist拆分为多个列表

java - 当玩家第二次尝试时会攻击两次

Java : How to resize buffered image in pixels?

python - 为什么从字典创建集合时会出错

java - 在 JAVA Servlet 中将 Runnable.run() 转换为 Callable.call()

php - 在 PHP 中,将 lambda 表达式用于可调用对象是否比字符串(或数组)更有效?

JAVA、GUI JPanel、JFrame、paintComponent、图形

java.io.FileNotFoundException : class path resource even though file exists in src/main/resources