3

我有两种方法:

class C1
{

  void m1() {//does sth}

  void m2(int x1, int x2) {//does sth}

 }

//记录任何方法花费的时间

 logMethodExecTime(m1);
 logMethodExecTime(m2);

不确定如何使用 JDK8 功能接口和方法引用来为方法 'logMethodExecTime' 定义正确的语法?

以下不起作用:

class Utils
{
   public static void logMethodExecTime(Supplier<Void> s)
   {
     long start = System.nanoTime();
     s.get();
     long end = System.nanoTime();
     System.out.println(((end-start)/1000000000d) + " secs");
   }
 }

和调用:

      C1 c = new C1();  
      Utils.logMethodExecTime(c::m1);

//Also how can we have one single definition of 'logMethodExecTime' 
//to accept any method with any number of args    
      Utils.logMethodExecTime(c::m2);
4

1 回答 1

10

而不是Supplier<Void>你应该使用一个plain Runnable,而不是坚持方法引用,你需要一个包含方法调用的显式lambda,捕获它需要的任何参数。例如:

logMethodExecTime(() -> m2(17, 37));

请注意,lambda 不一定只是单个方法调用。这使您可以更灵活地测量什么。

于 2015-03-15T20:26:47.900 回答