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

Is it possible to pass Function to ExecutorService instead of callable in 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));
    }
}

这段代码在我目前的工作中运行良好。我无法理解 threadPoolExecutor.submit 如何通过 "Function/Method" 而不是 callable?

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

据我了解,您想知道为什么您似乎能够将 "Function" 传递给 ThreadPoolExecutor.submit() method that takes a Callable, not a Function

解释是方法不能接受一个Function作为参数;您看到的是传入的 Callable,表示为 lambda expression(本质上是一个使用右箭头 (->) 语法的表达式)。

如前一篇文档所述,lambda 表达式用于提供一个接口的实现,该接口只有一个抽象方法,该抽象方法不是 Object 上方法的重写。这些通常注释为 FunctionalInterface, which is possibly where your confusion arose, although this is not a requirement as outlined in the Language Specification:

A functional interface is an interface that has just one abstract method (aside from the methods of Object), and thus represents a single function contract. This "single" method may take the form of multiple abstract methods with override-equivalent signatures inherited from superinterfaces; in this case, the inherited methods logically represent a single method.

在上面的示例中,根据 myManager.createAccount() 的 return 类型,您要么提供 Callable 的实现(如果您 return 任何东西),或者 Runnable 如果它是 void 方法:

() -> myManager.createAccount(token, profile)

您的 lambda 匹配抽象方法 call() or run() 的方法签名,因为它不带参数(如箭头左侧的 () 所示),并且 returns void 或一些结果。