我不知道如何表达我的问题,但这真的很简单。我想创建一个通用的占位符函数,它在一个已经存在的函数中接受一个参数。让我举一个例子。为简单起见,假设我想知道函数执行需要多长时间(以毫秒为单位)。
public class Example{
public static void main(String[] args) {
int arr[] = {30, 8, 21, 19, 50, ... , n};
//needs to accept a function with a parameter as an argument.
timeTakenFunc(foo(arr), arr);
timeTakenFunc(bar(arr), arr);
}
public static void foo(int A[]){
//do stuff
}
public static void bar(int A[]){
//do stuff
}
public static void timeTakenFunc(/*what goes here?*/, int A[]){
long startTime = System.nanoTime();
//placeholder for foo and bar function here
placeholder(A);
long endTime = System.nanoTime();
long duration = ((endTime - startTime) / 1000000);
System.out.println("function took: " + duration + "milliseconds");
}
}
如果需要更好地表达问题,请随时编辑我的问题。
最佳答案
使用 Java 8 lambdas和 functional interfaces , 你可以接受 Runnable
它执行一些通用的、未指定的操作。
public static void timeTakenFunc(Runnable func) {
long startTime = System.nanoTime();
//placeholder for foo and bar function here
func.run();
long endTime = System.nanoTime();
long duration = ((endTime - startTime) / 1000000);
System.out.println("function took: " + duration + "milliseconds");
}
你可以这样调用它:
timeTakenFunc(() -> foo(arr));
timeTakenFunc(() -> bar(arr));
这是 pre-lambda 等价物的简写:
timeTakenFunc(new Runnable() {
@Override public void run() {
foo(arr);
}
});
timeTakenFunc(new Runnable() {
@Override public void run() {
bar(arr);
}
});
我删除了 int[] A
参数,因为这里不一定需要。如您所见,arr
可以嵌入Runnable
里面.如果您想将其保留为参数,则可以从 Runnable
切换至 Consumer<int[]>
.
public static void timeTakenFunc(Consumer<int[]> func, int[] A) {
long startTime = System.nanoTime();
//placeholder for foo and bar function here
func.accept(A);
long endTime = System.nanoTime();
long duration = ((endTime - startTime) / 1000000);
System.out.println("function took: " + duration + "milliseconds");
}
timeTakenFunc(arr -> foo(arr), A);
timeTakenFunc(arr -> bar(arr), A);
或使用 method references与 ::
,你可以这样写:
timeTakenFunc(Example::foo, A);
timeTakenFunc(Example::bar, A);
这两个都等同于这个 pre-lambda 代码:
timeTakenFunc(new Consumer<int[]>() {
@Override public void accept(int[] arr) {
foo(arr);
}
});
timeTakenFunc(new Consumer<int[]>() {
@Override public void accept(int[] arr) {
bar(arr);
}
});
关于java - 如何在 Java 中创建一个通用的占位符函数,将函数作为参数供以后使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47856442/