4

Here is what I tried. and it does not even compile.

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

}

Couple of things I am trying to acheive/learn here is:

1) how to pass lambda expression as method parameter ( in main method above)

2) how to pass parameters to the function (in handleOpertion method, there is compilation error that apply takes only one parameter)

4

3 に答える 3

5

AFunctionは入力 x を受け取り、結果 y を生成します。したがって、 を実行するときに a を探しているのではなくFunction(生の型を使用したことは言及していません)、return converter.apply(x,y);aBiFunction<Integer, Integer, Integer>またはより単純なa を探しています。これBinaryOperator<Integer>は、すべての型パラメーターが同一であるためです。

1) ラムダ式をメソッド パラメータとして渡す方法 (上記のメイン メソッド)

BinaryOperator<Integer>インターフェイスのコントラクトを尊重するラムダ式を提供することにより、つまり、Integerパラメーターとして 2 を取り、 を返すメソッドを提供しますInteger

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

2) 関数にパラメーターを渡す方法 (handleOpertion メソッドで、apply がパラメーターを 1 つしかとらないというコンパイル エラーがあります)

関数は次のような形式であるf => uため、apply メソッドは単一の引数を取り、f(x) = 2 * x(回答の最初の部分を参照) のような数学関数のように単一の結果を生成します。

これが私が試したものです。そしてそれはコンパイルさえしません。

コードをコンパイルするには、メソッドを静的にするか、メソッド参照を使用する前に新しいインスタンスを作成します。次に、関数の適用メソッドを呼び出すaddときに、新しいインスタンスのメソッドを参照します。handleOperation

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

このメソッドは JDK に既に存在することに注意してくださいInteger::sum。参照の代わりに 2 つのプリミティブな int 値を取りますが、自動ボクシング メカニズムによってこのメソッドが有効になり、メソッド コンテキストでIntegerとして表示されるほど十分に近い値です。BinaryOperator<Integer>

于 2015-05-27T23:06:16.650 に答える
4

あなたのhandleOperationメソッドは を実装するオブジェクトを受け取りますFunction(Operation::addメソッド参照) は修飾されません。BiFunctionまた、引数が 2 つの場合は、代わりに を使用する必要があります。

動作するはずの例を次に示します。

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

}
于 2015-05-27T22:53:56.217 に答える
3

Function パラメーターは生 (型指定なし) であり、BiFunction である必要があります。

これを試して:

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

3 つの型すべてが同じ BiFunction は、(単一型の) ​​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);
于 2015-05-27T23:06:42.703 に答える