![从企业级开发到云原生微服务:Spring Boot实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/257/33831257/b_33831257.jpg)
2.4 方法引用
我们可以使用已有的方法定义方法引用,并像Lambda表达式一样,把方法引用作为方法的参数使用。在Java中,方法引用使用“::”(两个冒号)表示。
2.4.1 构造器方法引用
构造器方法引用使用“类名::new”来定义。
◎无参数构造:构造器不接收参数,返回值为新建的Person对象,符合Supplier函数接口的定义。使用基于Lambda表达式的Supplier函数接口的实现与“方法引用”是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_01.jpg?sign=1738856454-WQrxWZYBfJ6ZVfctIiMW6qIStgPQWMqg-0-4b3d9189497adccdaada480cc34d9a06)
◎一个参数构造:构造器接收一个参数,返回值为新建的Person对象,符合Function接口的定义。同样,使用基于Lambda表达式的Function接口实现与方法引用是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_02.jpg?sign=1738856454-uewbGL0rIM7sHal1KaBKMdhe6G8if7Ak-0-5b55e04b8b8d5ee2110ce67377c8077b)
◎两个参数构造:构造器接收两个参数,返回值为新建的Person对象,符合BiFunction接口的定义。同样,使用基于Lambda表达式的BiFunction接口实现与方法引用是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_03.jpg?sign=1738856454-VwWZJPOlszrlX0y2Yd6qQMFVF21TF5LI-0-53bfb6dba6287add36647a10a754528a)
◎三个参数构造:构造器接收三个参数,返回值为新建的Person对象,符合我们自定义的TriFunction接口的定义。同样,使用基于Lambda表达式的TriFunction接口实现与方法引用是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_04.jpg?sign=1738856454-x09tTobEBcMuL5MicLqeivAHP8vfi2Yw-0-7544250ab6767f7ca7dd38ed768183e0)
2.4.2 静态方法引用
静态方法引用是使用方法引用的方式调用类的静态方法,格式为“类名::静态方法”。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_05.jpg?sign=1738856454-KPhmNETC0AvAw8TItfZ7ytT0SqpRJCOx-0-7f4a6f4af355250692569c72bcd10ba7)
a.Integer::toString,toString方法是Integer类型的静态方法,toString方法的参数和返回值符合IntFunction接口的定义。
b.Lambda表达式,等同于上一句。
2.4.3 实例方法引用
实例方法引用是使用方法引用的方式来调用实例对象的方法,格式为“实例对象名::实例方法”。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_01.jpg?sign=1738856454-b1CXqm5F8ITrdle2CG65zdKvqOVwmbtI-0-e2b1dbbec22fe683a65af79b7cba1b0a)
walk方法是Person类实例对象方法。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_02.jpg?sign=1738856454-8FYHUYGjZAWzwUkcZTC3UKEt9kaSe1R9-0-d5321dacbb6b942543a6312915479a27)
2.4.4 引用特定类的任意对象的方法
引用特定类的任意对象的方法的格式为“类型名::实例方法”。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_03.jpg?sign=1738856454-wPZjMbVnY07ooNRccoshhh1aLILrCHAs-0-08bbbb7eb40d3e358d5e250631deea2b)
此处的sayName方法是实例对象方法,people列表里的三个Person实例均可以调用这个方法。注意和上面“实例方法引用”的区别,“实例方法引用”只针对一个实例对象进行方法引用,而当前的“引用特定类的任意对象的方法”可以对people列表里的任意Person实例对象进行方法引用。sayName方法是Person类的方法。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_04.jpg?sign=1738856454-lCNdaSBNhMRyFVcVj18Gl817Mhds9l3N-0-e143b6e73eca3b9bfdc20d5527900bdb)
从上面4种方法引用与Lambda表达式的对比可以知道,在调用现有类的已有方法时,方法引用比Lambda表达式更自然,可读性更强。比如上面的例子。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_05.jpg?sign=1738856454-UI8NUT8SmRp1QBqeYMkT5Lw19ZDcXZ0r-0-118031335f7a1909fc1ec2983eca6c87)
可以用方法引用改写成下面的样子。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_06.jpg?sign=1738856454-CW7gchmPVmLT7WICikhCxc2gki6RbYNM-0-7ea283c5834bf2e1e832ce238295b13f)