是否可以在Java 8中将Function传递给ExecutorService而不是callable?

bra*_*orm 2 future callable executorservice java-8

public class myService {

    @Autowired
    ExecutorService executor;

    public Result getServiceResult(Token token, Profile profile){
        //validate token and profile
        return getResult(token, profile).get();
    }

    private getResult (Token token, Profile profile){
       Future<Result> = threadPoolExecutor.submit(
               () -> myManager.createAccount(token, profile));
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在我目前的工作中运行良好.我无法理解如何threadPoolExecutor.submit通过"功能/方法"但不能通过callable

我正在使用Java 8和Spring框架.

Edd*_*Edd 5

据我所知,你想知道为什么你似乎能够将"函数"传递给ThreadPoolExecutor.submit()采用a Callable而不是a的方法Function.

的解释是,该方法不能采取Function作为一个参数; 你所看到的是一个Callable传入,表达为一个lambda表达式(基本上是一个使用右箭头(->)语法的表达式).

如前一文档所述,lambda表达式用于提供一个接口的实现,该接口只有一个抽象方法,而不是方法的重写Object.这些通常是注释的FunctionalInterface,这可能是您出现混淆的地方,尽管这不是语言规范中概述的要求:

功能接口是具有(从方法预留一个抽象方法的接口Object),并且因此代表一个单一的功能的合同.这种"单一"方法可以采用多个抽象方法的形式,从超级接口继承的覆盖等效签名; 在这种情况下,继承的方法在逻辑上代表一个方法.

在上面的示例中,根据返回类型myManager.createAccount(),您要么提供Callable(如果返回任何内容)的实现,要么Runnable是一个void方法:

() -> myManager.createAccount(token, profile)
Run Code Online (Sandbox Code Playgroud)

您的lambda与抽象call()run()方法的方法签名匹配,因为它不带参数(如()箭头左侧所示),并返回void或某些结果.