• 第二章《Stream流》
  • 方法的引用
  1. 在使用Lambda的时候,实际上传递的是一段代码,拿什么参数做什么操作,

2.1 沉于的Lambda表达式

分析: 其中 printString 方法只管调用 MyInter1 接口的 print 方法,而并不管 print 方法的具体实现逻辑会将字符串输出到什么地方去。而 main 方法通过 Lambda 表达式指定了函数式接口MyInter1 的具体操作方案为:拿到 String(类型可以推导,所以可省略)数据后,在控制台输出它。

2.2 用方法引用改进代码

  • 能否省去 Lambda 的语法格式?只要引用过去就行了。

请注意其中的双冒号::写法,这被称为“方法引用”,而双冒号是一种新的语法

2.3 方法的引用

  1. 双冒号为引用运算符::而它所在的表达式称为方法的引用,如果Lambda表达的函数方案已经存在与某个方法的实现中,那么可以通过双冒号来引用该方法作为Lambda表达式的替代者。
  2. 例如,System.out 对象中有一个重载的 println(String)方法恰好就是我们所需要的,那么对于printString 方法的函数式接口参数,对比以下两种写法,完全等效:
  • Lambda 表达式写法:s->System.out.println(s);
  • 方法引用写法:System.out::println
  1. 第一种语义指的是:拿到参数后经Lambda表达式,在传递给System.out.println方法。
  2. 第二种语义指的是:  直接让System.out中的println方法来代替Lambda表达式。
  3. 两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。
  4. 【注意:Lambda 中传递的参数一定是方法引用中的那个方法可以接收的类型,否则会抛出异常】
  • 推导与省略

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

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

2.4通过对象名引用成员方法

2.5通过类名引用静态方法

2.6通过Super关键字引用成员方法

如果存在继承关系,当 Lambda 中需要出现 super 调用时,也可以使用方法引用进行替代。

首先定义一个函数式接口

2.7通过 this 引用成员方法

11-24 21:20