2017-12-27 17 views
1

を参照しは、この方法を考える

a -> getVal(1, 2) 

がとにかくメソッド参照にこれを回すのがあるが、何かのように:

Class::getVal 

ありがとう

+4

あなたがこれを必要としますと思いますなぜ? – shmosel

答えて

2

さて、あなたはメソッド呼び出しに定数を渡している場合、あなたは元のメソッドを呼び出す別のメソッドを作成することができます。

private static Integer getVal (Integer a) { 
    return getVal(1,2); 
} 

、あなたは第二の方法のためのメソッド参照を使用することができます。

すなわちそれはあまり意味がありません、と述べた

ClassName::getVal 

a -> getVal(1, 2) 

を変更することができます。

P.S.ラムダ式でaの目的が何であるかはわかりません。あなたが無視しているからです。

一般に、指定されたメソッドのメソッド参照が、必要な機能インタフェースの1つのメソッドのシグネチャと一致する場合、それを渡すことができます。

例:

public static Integer apply (BinaryOperator<Integer> op, Integer a, Integer b) 
{ 
    return op.apply(a,b); 
} 

今、あなたが呼び出すことができます:あなたの元のメソッドを持つ

apply(ClassName::getVal) 

を。

+0

ありがとうございます。それは本当に問題です - 整数値をラムダに渡す方法:(val1、val2) - > getVal(val1、val2) – user1052610

+0

@ user1052610これは、メソッド参照を渡す場所によって異なります。 2つの引数を持つメソッドを持つ関数インタフェースが必要なメソッドに渡す場合は、元のメソッドを渡すことができます。 – Eran

+0

Map.computeIfAbsent()の2番目の引数に渡されています。だから私がしたいのはmap.computeIfAbsent( "xxx"、Class:getVal)です。 – user1052610

2

ここは例です。

interface Operator { 
    int operate(int a, int b); 
} 

class Calc { 
    public static int add(int a, int b) { 
     return a + b; 
    } 
} 

class Main {  
    public static void main(String[] args) { 
     // using method reference 
     int result = operate(1, 2, Calc::add); 
     // using lambda 
     int result = operate(1, 2, (a, b) -> Calc.add(a, b)); 
    } 

    static int operate(int a, int b, Operator operator) { 
     return operator.operate(a, b); 
    } 
} 

メソッドリファレンス(この例ではOperator)を使用するには、機能的なインターフェイスが必要です。また、関数インタフェースのインスタンスをそのオブジェクトとして受け入れるメソッドも必要です(この例ではoperate(int a, int b, Operator operator)。

UPDATE

あなたがオブジェクトラッパーが必要な場合は、単に

static int operate(ObjectWrapper wrapper, Operator operator) { 
    return operator.operate(wrapper.getA(), wrapper.getB()); 
} 

operate方法を変更してoperateメソッドを呼び出します。)

int result = operate(wrapper, Calc::add); 
1

GETVALを(意志のみ適用可能なタイプiの機能インタフェースが存在する場所で、メソッド参照として使用可能このようBiFunctionIntBinaryOperatorとして期待秒、または(zhhのanswerのように)カスタム機能インタフェース

例:

public static void main(String[] args) { 
     Integer result1 = calculate(1, 2, Second::getVal); 
     Integer result2 = calculateAsInt(1, 2, Second::getVal); 
    } 

    private static Integer getVal(Integer a, Integer b){ 
     return a + b; 
    } 

    private static Integer calculate(Integer a, Integer b, BinaryOperator<Integer> operator) { 
     return operator.apply(a, b); 
    } 

    private static int calculateAsInt(int a, Integer b, IntBinaryOperator operator) { 
     return operator.applyAsInt(a, b); 
    } 
関連する問題