我想创建一个存储方法引用列表的类,然后使用Java 8 Lambda执行所有这些,但是我遇到了一些问题。
这是班级
public class MethodExecutor {
//Here I want to store the method references
List<Function> listOfMethodsToExecute = new LinkedList<>();
//Add a new function to the list
public void addFunction(Function f){
if(f!=null){
listOfMethodsToExecute.add(f);
}
}
//Executes all the methods previously stored on the list
public void executeAll(){
listOfMethodsToExecute.stream().forEach((Function function) -> {
function.apply(null);
}
}
}
这是我为测试
创建的类public class Test{
public static void main(String[] args){
MethodExecutor me = new MethodExecutor();
me.addFunction(this::aMethod);
me.executeAll();
}
public void aMethod(){
System.out.println("Method executed!");
}
}
但是当我使用this::aMethod
传递me.addFunction
时出现了问题。
有什么问题?
答案 0 :(得分:4)
您应该提供一个合适的功能接口,抽象方法签名与您的方法参考签名兼容。在您的情况下,似乎应该使用Runnable
而不是Function
:
public class MethodExecutor {
List<Runnable> listOfMethodsToExecute = new ArrayList<>();
//Add a new function to the list
public void addFunction(Runnable f){
if(f!=null){
listOfMethodsToExecute.add(f);
}
}
//Executes all the methods previously stored on the list
public void executeAll(){
listOfMethodsToExecute.forEach(Runnable::run);
}
}
另请注意,在静态main
方法this
中未定义。可能你想要这样的东西:
me.addFunction(new Test()::aMethod);
答案 1 :(得分:4)
由于没有this
static
上下文中引用this
me.addFunction(this::aMethod);
您需要引用实例或定义函数以获取Test对象。
public void addFunction(Function<Test, String> f){
if(f!=null){
listOfMethodsToExecute.add(f);
}
}
和
me.addFunction(Test::aMethod);