2015-05-27 99 views
3

這是我試過的。它甚至沒有編譯。如何通過參數傳遞lambda表達式作爲Java 8中的參數?

public class LambdaExample { 

    public static Integer handleOperation(Integer x, Integer y, Function converter){ 
       return converter.apply(x,y); 
    } 

    public static void main(String[] args){ 
     handleOperation(10,10, Operation::add); 
    } 

} 

class Operation { 

    public int add(Integer x, Integer y){ 
     return x+y; 
    } 

} 

幾件事情我想acheive /在這裏學到的是:

1)如何通過lambda expression作爲方法的參數(在上面main法)

2)如何將參數傳遞到該功能(在handleOpertion方法中,有compilation錯誤,適用只需要一個參數)

回答

3

您的handleOperation方法需要一個對象實現FunctionOperation::add(方法參考)不符合條件。另外,對於兩個參數,您需要使用BiFunction

下面是應該工作的一個示例:

public class LambdaExample { 

    public static Integer handleOperation(Integer x, Integer y, BiFunction<Integer, Integer, Integer> converter){ 
       return converter.apply(x,y); 
    } 

    public static void main(String[] args){ 
     handleOperation(10,10, new Operation()); // should return 20 
    } 

} 

class Operation implements BiFunction<Integer, Integer, Integer> { 

    public Integer apply(Integer x, Integer y){ 
     return x+y; 
    } 

} 

更新:

public class LambdaExample { 

    public static Integer handleOperation(Integer x, Integer y, BiFunction<Integer, Integer, Integer> converter){ 
       return converter.apply(x,y); 
    } 

    public static void main(String[] args){ 
     handleOperation(10,10, Operation::add); // should return 20 
    } 

} 

class Operation { 

    public static int add(Integer x, Integer y){ 
     return x+y; 
    } 

} 
+0

不,這不是我想要的..我想在lambda中傳遞「add」函數。我不想通過'新的操作()'那裏.. –

4

Function接受一個輸入x和產生結果Y。因此,在執行return converter.apply(x,y);時,您不會尋找Function(不提及您使用的是原始類型),但是對於BiFunction<Integer, Integer, Integer>或更簡單,BinaryOperator<Integer>,因爲每個類型參數都是相同的。

1)如何通過lambda表達式作爲方法的參數(在上述主要方法 )

通過提供一個lambda表達式尊重BinaryOperator<Integer>接口的合同,即一種方法,其採用兩個Integer作爲參數並返回Integer

handleOperation(10,10, (a, b) -> a + b) 

2)如何將參數傳遞給該函數(在handleOpertion方法, 有編譯錯誤應用於僅採用一個參數)

因爲一個函數具有以下形式f => u的因而apply方法接受單個參數併產生單個結果,如數學函數,如f(x) = 2 * x(請參閱答案的第一部分)。

這是我試過的。它甚至沒有編譯。

要使您的代碼編譯,您可以使方法靜態或在使用方法引用之前創建一個新實例。然後當handleOperation將調用該函數的apply方法時,它會參考新實例的add方法。

handleOperation(10,10, new Operation()::add); 

請注意,此方法已存在於JDK中,它的格式爲Integer::sum。它採用兩個基本int值而不是Integer引用,但它足夠接近,以便自動裝箱機制將使此方法在方法上下文中顯示爲BinaryOperator<Integer>

+0

謝謝。我根據我們的生產代碼製作了這個例子。在那裏我看到'handleRequest(getToken(),(token) - > service.makeRequest(token,ID))''。在'handleRequest(String token,Function function){return function.apply(token)}'。我在想如果我可以將其轉換爲'service :: makeRequest'。但我想這是不可能的.. –

+1

@brainstorm不,我不認爲,因爲'ID'參數。但拉姆達很好,國際海事組織。 –

2

你的函數參數是raw(無類型),應該是BiFunction。所有3種

public static Integer handleOperation(Integer x, Integer y, BiFunction<Integer, Integer, Integer> converter){ 
    return converter.apply(x,y); 
} 

一個雙功能有(單輸入)BinaryOperator替代的相同即可:

試試這個

public static Integer handleOperation(Integer x, Integer y, BinaryOperator<Integer> converter){ 
    return converter.apply(x,y); 
} 

調用它,你可以這樣做:

int sum = handleOperation(1, 2, (x, y) -> x + y); // 3 

其實,你已經實施了減少。這個電話同樣可以寫成:

int sum = Stream.of(1, 2).reduce((x, y) -> x + y); 
相關問題