是否可以将 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
或一些结果。
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
或一些结果。