簡體   English   中英

將參數傳遞給方法引用

[英]Passing arguments to Method References

給定此方法:

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

可以稱為lambda:

a -> getVal(1, 2)

無論如何,有沒有將其轉換為方法引用,例如:

Class::getVal

謝謝

好吧,如果你是路過常數的方法調用,您可以創建一個調用原始方法的另一種方法:

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

那么你可以使用方法引用了第二種方法。

例如,你可以改變

a -> getVal(1, 2)

ClassName::getVal

這就是說,它並沒有太大的意義。

PS,目前還不清楚什么目的a在lambda表達式,因為你忽視它。

一般來說,如果它所需功能接口的單個​​方法的簽名相匹配可以傳遞給定的方法的方法的參考。

例:

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

現在您可以致電:

apply(ClassName::getVal)

與原來的方法。

這是一個例子。

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 )。

更新

如果需要對象包裝,只需將operate方法更改為

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

然后調用operate方法:

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

getVal()僅在期望適用類型的功能接口(例如BiFunctionIntBinaryOperator )或自定義功能接口(如zhh的答案 )的地方可用作方法引用。

例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM