- 第二章《Stream流》
- 方法的引用
- 在使用Lambda的时候,实际上传递的是一段代码,拿什么参数做什么操作,
2.1 沉于的Lambda表达式
分析: 其中 printString 方法只管调用 MyInter1 接口的 print 方法,而并不管 print 方法的具体实现逻辑会将字符串输出到什么地方去。而 main 方法通过 Lambda 表达式指定了函数式接口MyInter1 的具体操作方案为:拿到 String(类型可以推导,所以可省略)数据后,在控制台输出它。
2.2 用方法引用改进代码
- 能否省去 Lambda 的语法格式?只要引用过去就行了。
请注意其中的双冒号::写法,这被称为“方法引用”,而双冒号是一种新的语法
2.3 方法的引用
- 双冒号为引用运算符::而它所在的表达式称为方法的引用,如果Lambda表达的函数方案已经存在与某个方法的实现中,那么可以通过双冒号来引用该方法作为Lambda表达式的替代者。
- 例如,System.out 对象中有一个重载的 println(String)方法恰好就是我们所需要的,那么对于printString 方法的函数式接口参数,对比以下两种写法,完全等效:
- Lambda 表达式写法:s->System.out.println(s);
- 方法引用写法:System.out::println
- 第一种语义指的是:拿到参数后经Lambda表达式,在传递给System.out.println方法。
- 第二种语义指的是: 直接让System.out中的println方法来代替Lambda表达式。
- 两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。
- 【注意:Lambda 中传递的参数一定是方法引用中的那个方法可以接收的类型,否则会抛出异常】
- 推导与省略
如果使用 Lambda,那么根据“可推导就是省略”的原则,无需指定参数类型,也无需指定重载形式---它们都被自动推导,而如果使用方法引用,也同样可以根据上下文进行推导。
- 函数式接口是 Lambda 的基础,而方法引用是 Lambda 的孪生兄弟。
2.4通过对象名引用成员方法
2.5通过类名引用静态方法
2.6通过Super关键字引用成员方法
如果存在继承关系,当 Lambda 中需要出现 super 调用时,也可以使用方法引用进行替代。
首先定义一个函数式接口