方法引用表达式(1)

概述

在使用lambda表达式的时候,我们实际上传递进去的代码就是一种解决办法:拿什么参数做什么操作,那么考虑一种情况:如果我们在lambda中所指定的操作方案,已经有地方存在相同的方案,那么是否还有必要再重写重复逻辑。

代码演示

package day17;

public class Demo01Print {
    //定义一个方法,参数传递Printable接口,对字符串进行打印
    public static void printString(Printable p){
        p.print("helloword");
    }

    public static void main(String[] args) {
        //调用printString方法,方法的参数Printable是一个函数式接口,所以可以传递lambda
        printString((s)->{
            System.out.println(s);
        });

        printString(System.out::print);
    }

    /*
    分析:
    lambda表达式的目的,打印参数传递的字符串
    把参数s,传递给了system.out对象,调用out对象中的方法println对字符串进行了输出
    注意:
        1.system.out对象是已经存在的
        2.println方法也是已经存在的
    所以可以使用方法引用来优化lambda表达式
    可以使用system.out方法直接引用(调用)println方法
     */
}

方法引用符

双冒号::为引用运算符,而它所在的表达式被称为方法引用。如果lambda要表达的函数方法已经存在于某个方法的视线中,那么则可以通过双冒号来引用该方法作为lambda的替代者。

语义分析

例如概述里面举的例子,system.out对象中有一个重载的println(String)方法恰好就是我们所需要的。那么对于printString方法的函数式接口参数,对比下面两种写法,完全等效:

lambda表达式写法:s -> System.ouot.println(s);

方法引用写法:System.out::println

第一种语义是指:拿到参数之后经lambda之手,继而传递给system.out.println方法去处理。

第二钟等效写法的语义是指:直接让system.out中的println方法来取代lambda。两种写法的执行效果完全一样,而第二钟方法引用的写法服用了已有方案,更加简洁。

注:lambda中,传递的参数一定是方法引用中的那个方法可以接受的类型,否则会抛出异常、

推导与省略

如果使用lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式--它们都将被自动推导。而如果使用方法引用,也是同样可以根据上下文进行推导。

函数式接口是lambda的基础,而方法引用是lambda的孪生兄弟。

posted @ 2020-11-22 22:39  小明-o3rr0r  阅读(122)  评论(0编辑  收藏  举报