使用Java 8+lambda表达式,如果您的类或接口只有一个抽象方法(有时称为SAM type),例如:
public interface MyInterface {
String doSomething(int param1, String param2);
}
然后,在使用MyInterface的任何地方,都可以替换lambda表达式:
class MyClass {
public MyInterface myInterface = (p1, p2) -> { return p2 + p1; };
}
例如,您可以非常快速地创建一个新线程:
new Thread(() -> someMethod()).start();
并使用method reference syntax使其更干净:
new Thread(this::someMethod).start();
Without个lambda表达式,最后两个示例如下所示:
new Thread(new Runnable() { someMethod(); }).start();
一种常见的模式是将其"包装"到一个接口中,例如Callable
,然后传入一个可调用的:
public T myMethod(Callable<T> func) {
return func.call();
}
这种模式被称为Command Pattern.
请记住,最好为您的特定用途创建一个界面.如果您 Select 使用Callable,那么您可以将上面的T替换为您期望的任何类型的返回值,比如String.
对于你下面的 comments ,你可以说:
public int methodToPass() {
// do something
}
public void dansMethod(int i, Callable<Integer> myFunc) {
// do something
}
然后调用它,可能使用匿名内部类:
dansMethod(100, new Callable<Integer>() {
public Integer call() {
return methodToPass();
}
});
请记住,这不是一个"把戏".它只是java与函数指针的基本概念类似功能.