简体   繁体   English

如何使用方法引用调用参数化方法

[英]How to invoke parameterized method with method reference

Consider below code, 考虑下面的代码,

interface TestInter {
    public void abc();
}


class DemoStatic {

    public static void testStatic(String abc) {
        System.out.println(abc);
    }

    public void runTest () {

        // Using lambda expression.
        String str = "demo string" ;
        TestInter demo1 = () -> DemoStatic.testStatic(str);
        demo1.abc();

        // Using method reference.
        TestInter demo2 = DemoStatic::testStatic; // This line is not compiling.
        demo2.abc();
    }
}

We can invoke the testStatic method as body of TestInter interface's abc() implementation if parameter of testStaic() method will be eliminated as described in this so answer . 我们可以调用testStatic方法的身体TestInter接口的abc()执行如果参数testStaic()方法将被淘汰在描述这个如此回答

But in this case how can we write method reference for parameterized method testStatic ? 但在这种情况下,我们如何为参数化方法testStatic编写方法参考?

Your functional interface TestInter does not have corresponding signature for your testStatic(String) method. 您的功能接口TestInter没有相应的testStatic(String)方法签名。 If you want to refer to testStatic() using the :: notation, you should add the parameter: 如果要使用:: notation引用testStatic() ,则应添加参数:

interface TestInter2 {
    public void abc(String abc);
}

public void runTest () {
    TestInter2 demo2 = DemoStatic::testStatic;
    demo2.abc(str);
}

According to Oracle Java tutorial , there are four kinds of method reference: 根据Oracle Java教程 ,有四种方法参考:

四种方法参考

I prepared 3 interfaces - for 0, 1 and 2 parameters. 我准备了3个接口 - 用于0,1和2参数。 Then we have 3 static and 3 instance methods: 然后我们有3个静态和3个实例方法:

interface F0 {
    void f0();
}
interface F1 {
    void f1(MetRef i1);
}
interface F2 {
    void f2(MetRef i1, MetRef i2);
}

public class MetRef {
    public static void stat0() {;}
    public static void stat1(MetRef a) {;}
    public static void stat2(MetRef a, MetRef b) {;}

    public void inst0() {;}
    public void inst1(MetRef a) {;}
    public void inst2(MetRef a, MetRef b) {;}
}

Now look how each of the methods may be used as a method reference in various combinations, compare them with the previous table. 现在看看每种方法如何在各种组合中用作方法参考,并将它们与前一个表进行比较。 See different method reference types in action and notice from where the parameters come. 查看操作中的不同方法引用类型,并注意参数的来源。

public class Test {
    public static void main(String[] args) {
        final MetRef mr = new MetRef();

        final F0 mr01 = MetRef::stat0; // 1: f0() ~ MetRef.stat0() 
        final F0 mr02 = mr::inst0;     // 2: f0() ~ mr.inst0()
        final F0 mr04 = MetRef::new;   // 4: f0() ~ new MetRef()

        final F1 mr11 = MetRef::stat1; // 1: f1(i1) ~ MetRef.stat1(i1)
        final F1 mr12 = mr::inst1;     // 2: f1(i1) ~ mr.inst1(i1)
        final F1 mr13 = MetRef::inst0; // 3: f1(i1) ~ i1.inst0()       <== NOTICE!

        final F2 mr21 = MetRef::stat2; // 1: f2(i1, i2) ~ MetRef.stat2(i1, i2)
        final F2 mr22 = mr::inst2;     // 2: f2(i1, i2) ~ mr.inst2(i1, i2)
        final F2 mr23 = MetRef::inst1; // 3: f2(i1, i2) ~ i1.inst1(i2) <== NOTICE!
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM