我们在最一开始接触Lambda表达式时就说过,Lambda表达式就像一段可以传递的代码,将代码像数据一样传递,今天我们的“猪脚”就是方法引用和构造器引用与数组引用,他们兄弟三个可以做到真正将Lambda表达式像数据一样进行传递。
我们先来看一下方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用"方法引用"
(可以理解为方法引用是Lambda表达式的另外一种表现形式)
对象::实例方法名
类::静态方法名
类::实例方法名
对象::实例方法名
我们看下面一段代码,Consumer是一个消费型接口,没有返回值,我们直接写(x)->System.out.println(x)将x打印到控制台。这时Lambda体已经实现了这个接口,就可以使用方法引用的方式调用Lambda表达式,这里Systrm.out.println(x)我们点println()里面是一个实例方法,这时就需要使用 对象::实例方法名 去引用Lamdba表达式。先使用System.out获取到PrintStream对象然后使用ps::println引用Lambda表达式
换一种形式可能更容易理解一些
但是还是需要注意的一点,使用方法引用的前提是,Lambda表达式实现的接口中抽象方法的参数列表和返回值要和Lambda体调用方法的参数列表和返回值保持一致。
Lambda表达式实现的函数式接口中的抽象方法的参数列表和返回值
Lambda体调用方法的参数列表和返回值
最终版代码
类::静态方法名
这里我们使用Comparator接口进行两个Integer的大小。在lamdba体中Integer类中的compare()是静态方法,在进行方法引用时直接使用类名.方法名调用
comparator 是javase中的接口,位于java.util包下,Integer是包装类
当然参数列表和返回值要保持一致
类::实例方法名
调用实例方法都是用对象名去调用,只有静态方法可以使用类名直接调用,但!当Lambda表达式中,算了有点绕,直接上图
BiPredicate是Predicate断言型函数式接口的子接口
其次,我们再来看一下 构造器引用
ClassName::new
这里我们使用供给型接口,在Lambda表达式中new一个Employee对象,使用构造器引用的方式可以调用到Employee的无参构造器。
当然一定要注意,不是每次都会调用无参构造器,调用哪个构造器取决于函数式接口中抽象方法的参数列表。
最后来看一下 数组引用:
Type[ ]::new;
不多废话了,都大差不差,直接上图吧,30分钟的视频做了2个多小时笔记,晕