将参数传递给方法引用

时间:2017-12-27 07:48:23

标签: java lambda java-8 method-reference

鉴于此方法:

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

可以称为lambda:

a -> getVal(1, 2)

无论如何将其变成方法参考,例如:

Class::getVal

由于

3 个答案:

答案 0 :(得分:2)

好吧,如果要将常量传递给方法调用,则可以创建另一个调用原始方法的方法:

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

然后你可以使用方法参考第二种方法。

即。你可以改变

a -> getVal(1, 2)

ClassName::getVal

那就是说,它没有多大意义。

P.S。,你不清楚你的lambda表达式中a的目的是什么,因为你忽略了它。

通常,如果给定方法的方法引用与所需功能接口的单个​​方法的签名匹配,则可以传递该方法引用。

示例:

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

现在你可以致电:

apply(ClassName::getVal)

使用您的原始方法。

答案 1 :(得分: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)。而且你还需要一个接受函数接口实例作为其parermater的方法(在本例中为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);

答案 2 :(得分:1)

getVal()仅可用作方法参考,适用于需要适用类型的功能接口的地方,例如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);
    }