java - 如何在 Java 中创建一个通用的占位符函数,将函数作为参数供以后使用?

标签 java

我不知道如何表达我的问题,但这真的很简单。我想创建一个通用的占位符函数,它在一个已经存在的函数中接受一个参数。让我举一个例子。为简单起见,假设我想知道函数执行需要多长时间(以毫秒为单位)。

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 lambdasfunctional 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/

相关文章:

java - 大数减法

java - 配置为监听端口 8080 的 Tomcat 连接器启动失败

java - SQLite JDBC中无需重复列即可实现全外连接效果

java - 在将对象插入数组列表之前,如何删除 java 中对象的重复属性

java - 使用 gradle 从 javadoc 中排除 R.java 的正确方法

java - 为什么 PasswordField 在 Vaadin 中使用 String 而不是 char[]?

java - 如何从服务器URL接收Json数据?

java - 有没有java函数可以在鼠标进入屏幕时将鼠标坐标更改为屏幕中心?

java - Gradle 源集 : classesDir has been deprecated

java - 重用引用是否有助于 Java 中的 GC