在Java中如何将函数作为参数传递?[副本]

在Java中,如何将一个函数作为另一个函数的参数传递

Java 8及以上版本

使用Java 8+lambda表达式,如果您的类或接口只有一个抽象方法(有时称为aSAM类型),例如:

公共接口MyInterface{
字符串doSomething(int参数1,字符串参数2);
}

然后,在使用MyInterface的任何地方,都可以替换lambda表达式:

类MyClass{
公共MyInterface MyInterface=(p1,p2)->{返回p2+p1;};
}

例如,您可以非常快速地创建新线程:

新线程(()->someMethod()).start();

并使用方法引用语法使其更清晰:

新线程(this::someMethod).start();

如果没有lambda表达式,最后两个示例如下所示:

新线程(new Runnable(){someMethod();}).start();

Java 8之前

一种常见的模式是将其“包装”在接口中,例如Callable,然后传入一个Callable:

公共T myMethod(可调用<T>func){
返回函数调用();
}

此模式称为命令模式

请记住,最好为您的特定用途创建一个接口。如果您选择使用callable,那么您将使用您期望的任何类型的返回值(如String)替换上面的T

对于您在下面的评论,您可以说:

public int methodToPass(){
//做点什么
}
public void dansMethod(int i,可调用<Integer>myFunc){
//做点什么
}

然后调用它,可能使用匿名内部类:

dansMethod(100,新的可调用<Integer>(){
公共整数调用(){
返回methodToPass();
}
});

请记住,这不是一个“把戏”。它只是java与函数指针的基本概念等价物

发表评论