如何在java中传递函数作为参数多次运行它

时间:2016-10-03 09:23:29

标签: java

很抱歉提出这个问题我已经看到它被问了很多但不是我认为的方式。

我的目标是创建一个重试函数,它会循环'n'时间来尝试运行我作为参数传递的方法。

所以在这种情况下我想运行函数“myFunction()”,但我知道有时返回的值是false,我想运行它直到返回值为真。

这就是我希望它运行的方式:

public static void main (String [] args){
    boolean did work = retry (myFunction(),5)
    if(didwork){
        System.out.println("I found my stuff");
    } else {
        System.out.println("I didn't found my stuff");
    }
}

public boolean retry (Function function, int loopTry){
    boolean success = false;
    for(int i=0 ; i<loopTry ; i++){
        success = function.run();
        if(success){
            break;
        }
    }
    return success;
}

public boolean myFunction(){
    boolean found = false;
    //do stuff
    if(stuff){
        found = true;
    }
    return found;
}

我知道这是不可能的(至少在java 7中可能是8)

我已经看到一些答案建议为特定函数等创建一个对象...但是这不会使重试函数变得通用,因为我需要为每个我想重试的方法重新创建一个对象。这不是我想要的。

所以我想知道是否有一种“干净”的方式(即使在java 8中)也没有?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以在此处尝试reflection

E.g:

public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {

  Method method = Test.class.getMethod("myFunction");

  boolean didwork = retry(method, 5);
  if (didwork) {
      System.out.println("I found my stuff");
  } else {
      System.out.println("I didn't found my stuff");
  }

}

public static boolean retry(Method method, int loopTry)
        throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

  boolean success = false;
  for (int i = 0; i < loopTry; i++) {
    success = (Boolean) method.invoke(null);
    if (success) {
      break;
    }
  }
  return success;
}

public static boolean myFunction() {
  boolean found = false;

  //do stuff
  if(stuff){
     found = true;
  }

  return found;
}

答案 1 :(得分:0)

你可以在myFunction()中添加一个while循环,它在函数内“重试”。这只是一个额外的路线。如果将最大尝试次数定义为n,则最多两个或三个。在第二种情况下,您重新创建了尝试的效果,直到您获得真或直到达到尝试的数字。