![从企业级开发到云原生微服务: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=1738888438-Nqyz1GgPavZqciFU64EpSFc48QfP5Qjy-0-b72a1837b9f3ff0282fa99f8c55529dd)
◎一个参数构造:构造器接收一个参数,返回值为新建的Person对象,符合Function接口的定义。同样,使用基于Lambda表达式的Function接口实现与方法引用是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_02.jpg?sign=1738888438-bchDrKyD0mz1Zs2XD5nkjJEljuThXZnI-0-2fed616e39a3f20b61178d1b8f258f93)
◎两个参数构造:构造器接收两个参数,返回值为新建的Person对象,符合BiFunction接口的定义。同样,使用基于Lambda表达式的BiFunction接口实现与方法引用是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_03.jpg?sign=1738888438-2sUWp85wzxJ8oQ3lpwLgVeDCAZyXBLep-0-c5fe6bb6048f5f1b4af808336eb4afe8)
◎三个参数构造:构造器接收三个参数,返回值为新建的Person对象,符合我们自定义的TriFunction接口的定义。同样,使用基于Lambda表达式的TriFunction接口实现与方法引用是等同的。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_04.jpg?sign=1738888438-k4AJVKHmXQBshrj0UEE5MS0I1VwGdIuD-0-c466ce3f9a6a8d2fd58973b23d6e3d27)
2.4.2 静态方法引用
静态方法引用是使用方法引用的方式调用类的静态方法,格式为“类名::静态方法”。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_32_05.jpg?sign=1738888438-lTOiVEfh52LqNkh1Qt2QCwuOJleI2Y4A-0-f1126c7b519dd206fbd26cc1fa3b2810)
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=1738888438-aNgszNnSsy5l20lBrForcnFXPD03ipUF-0-6395659f8d53dd9ccefd14811aa36987)
walk方法是Person类实例对象方法。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_02.jpg?sign=1738888438-3rjNiOdNU4hbqBRLXe73aEYVMB0U7lmE-0-bac3dfda5eefa03984bacd53953800ad)
2.4.4 引用特定类的任意对象的方法
引用特定类的任意对象的方法的格式为“类型名::实例方法”。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_03.jpg?sign=1738888438-0Qmgx1X0IYP3CJserXe0fbQPCbEeglSz-0-7d7e7af190d950afd240203dcf1890a1)
此处的sayName方法是实例对象方法,people列表里的三个Person实例均可以调用这个方法。注意和上面“实例方法引用”的区别,“实例方法引用”只针对一个实例对象进行方法引用,而当前的“引用特定类的任意对象的方法”可以对people列表里的任意Person实例对象进行方法引用。sayName方法是Person类的方法。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_04.jpg?sign=1738888438-r5MMoRVmX65abZw9x3qk8Up0w0DT8TSA-0-4509f96102d142810de25c775c0fcf32)
从上面4种方法引用与Lambda表达式的对比可以知道,在调用现有类的已有方法时,方法引用比Lambda表达式更自然,可读性更强。比如上面的例子。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_05.jpg?sign=1738888438-pGq9YmpcVdbFC4FzvvqgwzEJk2pume69-0-2189ad5252814e8e698fa221943546e5)
可以用方法引用改写成下面的样子。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_33_06.jpg?sign=1738888438-mXoFVrlZcZRVbudyxhmme5PjEkSHuhN7-0-c9d39ceb7daa2adf20ef8b299f0f8434)