2017-01-17 44 views
1

我在ABC類,其定義大致如下傳遞函數爲參考,以另一種方法在Java中

Boolean getBool(Value val1, Value val2) { 
    if (val1.getVal() == val2.getVal()) { 
    return true; 
    } 
    return false; 
} 

我如何可以通過這個方法,參照其他方法的功能,比方說工作()和從那裏調用它。

String operate(<<<Pass getBool method here>>>, Param1) { 
    val1 = some computations on Param1 
    val2 = some other computations on Param2 
    Boolean value = <<<<<Call getBool with val1 and val2 here>>>>> 
    if (value) { return "Yes"; } 
    else { return "No"; } 
} 

請幫忙!! 我已經閱讀了幾個解決方案,但他們要麼通過引用傳遞一個方法參數,但無效返回類型,或者,通過引用傳遞一個方法沒有任何參數和一些返回類型。 我想通過參數傳遞一個函數,並有一些返回類型。

+0

'布爾值= getBool(VAL1,val2的);'? – nbokmans

+0

你可以使用'BiPredicate '類型。這裏是一個列表:https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html或者,你可以定義你自己的功能界面。 –

+0

簡單的方法就是將調用包裝到lambda表達式中,然後傳遞lambda表達式。 Java有一個'::'iirc,可以用來獲取對方法的引用。 – Carcigenicate

回答

2

您的方法可以用Java 8功能接口BiFunction<T, U, R>表示,因爲它接受兩個參數並返回一個值。

String operate(BiFunction<Value,Value,Boolean> function, TypeOfParam1 param1, TypeOfParam2 param2) { 
    val1 = some computations on param1 
    val2 = some other computations on param2 
    Boolean value = function.apply(val1,val2); 
    return value ? "Yes" : "No"; 
} 

並調用operate與方法參考:

ABC abcInstance = ... 
String boolString = operate (abcInstance::getBool, param1, param2); 
+0

謝謝!這有助於:) – Sumit

1

使用雙功能類:

public class Test { 

private static Boolean getBool(int val1, int val2) { 
    if (val1 == val2) { 
     return true; 
    } 
    return false; 
} 

private static String operate(BiFunction<Integer, Integer, Boolean> fun, int param1, int param2) { 
    int val1 = param1; 
    int val2 = param2; 
    Boolean value = fun.apply(val1, val2); 
    if (value) { 
     return "Yes"; 
    } else { 
     return "No"; 
    } 
} 

public static void main(String[] args) { 
    operate(TestStaticReference::getBool, 1, 2); 
    } 

} 
相關問題