我正在尝试创建一种方法,允许我利用我认为称为 lambdas 的东西,在一系列连接上执行一个方法。
这是我经过一番研究后得出的代码,但它不起作用:
performGlobalAction(()->{
// doSomething();
});
您还需要查看我假设的方法:
private <T> void performGlobalAction(Callable<T> action) {
for(int i = 0; i < connectionList.size(); i++) {
connectionList.get(i).performAction(action);
}
}
这提供了以下错误:
The method performAction(Callable<T>) in the type Connection is not
applicable for the arguments (() -> {})
此方法的目标是允许我自己“随时”构建一个方法,而无需为其创建 void。
这可能吗?似乎我已经使用了很多以前做过的语句。看起来这正是 lambda 语句的工作原理。
最佳答案
The call
method of the Callable interface返回 T
类型的值.您的 lambda 只是 call 方法的简写,同样应该返回 T
。值(value)。
任何满足 FunctionalInterface 要求的接口(interface)可以用 lambda 表达式代替。这样的接口(interface)将有一个抽象方法,一个没有 default implementation 的方法。 .对于你的问题,接口(interface)是Callable
,抽象方法为call
.然后,lambda 表达式在该接口(interface)的匿名实现中充当该抽象方法的主体。
让我们以一个方法doStuff(Callable<Integer> stuff)
为例.为了满足这个接口(interface),你可以给一个匿名类:
doStuff(new Callable<Integer>(){
public Integer call(){
return 5;
}
});
或者您可以使用 lambda:
doStuff( () -> {
return 5;
} );
或者更简洁:
doStuff( () -> 5 );
如果你的方法没有返回类型,可能是 Runnable
会更合适。
另请参阅:Lambda Expressions (Oracle) - 'Use Standard Functional Interfaces with Lambda Expressions'
关于Java - 通过参数传递方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985390/