使用Callable而不是Supplier,反之亦然

时间:2018-12-11 15:26:29

标签: 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
}

1 个答案:

答案 0 :(得分:2)

  

我没有看到产生使用Callable的任何线程。但这是   可以使用Callable代替Supplier。

正如评论中所提到的,CallableSupplier都是具有相同功能描述符的接口,即其SAM(单一抽象方法)的签名相同。

一个区别是Callable#call可以引发检查的异常,而另一方面Supplier#get则不能。

这意味着对于您的用例,使用它们中的任何一个都是完全可以接受的,尽管如this answer

中所述

尽管在这种特定情况下两个接口都足以满足不同的目的,即Callable是“返回结果的任务”,而Supplier是“结果的提供者”。相对于前者,后者更“一般”。

因此,结论是选择最适合您的特定情况的