Lambda之通过“方法引用”让你的Lambda表达式更加简洁
我们先来看这样两行代码
可以发现,Lambda本身已经很简洁了,可是方法引用可以更加简洁,今天我们就一起来学习学习什么是“方法引用”
- 01什么是方法引用
方法引用通过方法的名字来指向一个方法
方法引用可以使语言的构造更紧凑简洁,减少冗余代码
方法引用使用一对冒号 ::
方法引用是Lambda表达式的另一种写法
上面四个点就是方法引用的一些特点,下面我们再来看看如何使用方法引用
02方法引用的使用
一、语法格式
1.对象::实例方法名
2.类::静态方法名
3.类::实例方法名
这种调用方式比较特殊,因为我们平时写java代码的时候,从来没有用过“类名.实例方法”这种形式,这里解释一下。“方法引用”中,这种调用形式是有特殊条件的,就是:参数列表中的第一个参数调用的方法的参数是第二参数,就像下面这个x和y的关系一样,x调用的equals方法的参数是y。
二、前提条件
方法引用使用的前提条件,其实就是方法引用的使用规则,这点十分重要!
我们都知道Lambda表达式的主要作用就是去实现函数式接口中的抽象方法,那么当这个抽象接口的实现只是一个方法的调用的时候,就可以用方法引用去代替Lambda表达式
函数式接口中,抽象方法的返回值和参数列表和方法引用的方法的返回值还有参数列表相同这个两个前提条件,光这么看可能有些不容易理解,下面举个例子
三、举例子
Consumer<String> c=(x)->System.out.println(x);这个Lambda表达式的实现其实就只有一个方法的调用,"System.out"对象调用了“println”方法,根据“方法引用”的前提条件,就可以把这个Lambda表达式变为方法引用,变为:
Consumer<String> c=System.out::println;
然后,我们再来看一看,改写为"System.out::println"这种形式是否满足了第二个前提条件:“抽象方法的返回值和参数列表和方法引用的方法的返回值还有参数列表相同”
通过查看Consumer接口的源码和println方法的源码可以发现,Consumer接口中的accept方法是无返回值,参数列表只有一个泛型参数。而println方法是无返回值参数列表只有一个String参数,符合我们使用“方法引用”的第二个前提。
03总结
到这里应该都能理解什么是“方法引用”了,其实就是在满足了一定条件下对Lambda表达式的简写。除了“方法引用”还有“构造器引用”和“数组引用”都是在满足了一定条件下对Lambda表达式的一种简写,但是核心思想都是一样的,感兴趣的小伙伴可以自己学习一下。