2016-10-03 26 views
-4

不好意思問這個問題我已經看到它已經被問了很多,但不是我想的方式。如何在java中傳遞函數作爲參數來多次運行

我的目標是讓一個重試函數循環'n'的時間量來嘗試運行我作爲參數傳遞的方法。

所以在這種情況下,我想運行函數「myFunction()」,但我知道有時返回的值是false,我想運行它直到返回值爲true。

這就是我想它來運行:

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中)?

謝謝

+1

創建myFunction的接口。然後用你想要的東西實現一個類。您需要將此類的實例傳遞給'retry'來調用該函數。 – AxelH

+1

似乎你的功能沒有輸入和輸出。請看Java中的'Supplier'接口。https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html – dty

+0

'retry'接受一個'Function'對象參數,而不是'boolean'。這段代碼是否編譯? –

回答

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; 
} 
+0

感謝您的回答,它非常接近工作。我必須使這些不是靜態的,並給對象的實例(在這種情況下,測試)作爲參數來調用,它確實工作 – user3718160

0

你可以只添加一個while循環給myFunction()的「重試」功能裏面。這只是一條附加線。如果將最大嘗試次數定義爲n,則最多兩個或三個。在第二種情況下,您重新創建了嘗試的效果,直到您獲得真實或直到達到嘗試的數字。

+0

事情是我不想只做一個循環我想在每次嘗試之間的多個事情我想使用此重試功能的多個功能。 我只是想知道是否有可能通過創建這個「重試」功能來避免我的每個函數中有多個循環 – user3718160

相關問題