概述
- 方法引用:當要傳遞給Lambda體的操作,已經有實現的方法了,就可以使用方法引用
- 方法引用:在Lambda的基礎上進一步的簡化。換句話說,方法引用就是Lambda表達式,也就是函數式接口的一個實例,通過方法的名字來指向一個方法,可以認為是Lambda表達式的一個語法糖。
- 要求:實現接口的抽象方法體的參數列表和返回值類型,必須與方法引用的方法的參數列表和返回值類型保持一致
- 使用操作符 :: 將類(或對象)與方法名分割開來
- 主要分為下面三種使用情況:
- 對象 :: 實例方法名
- 類 :: 靜態方法名
- 類 :: 實例方法名
場景:模擬發送郵件
public class EmailService {public EmailService() {System.out.println(Thread.currentThread().getName() + "無參構造");}public void timingSendEamil(){System.out.println(Thread.currentThread().getName() + "發送郵件");}public static void staticEamil(){System.out.println(Thread.currentThread().getName() + " static 發送郵件");}}
public class ServiceTest {public static void main(String[] args) {/*** 1、JDK8 之前*/new Thread(new Runnable() {@Overridepublic void run() {new EmailService().timingSendEamil();}}).start();/*** 2、JDK8 后使用Lambda表達式優化*/new Thread(()->{new EmailService().timingSendEamil();}).start();/*** 3、因為方法引用是在Lambda的基礎上進一步的簡化,所以使用方法引用進一步優化上面的代碼* 格式: 實例對象::實例方法*/EmailService emailService = new EmailService();new Thread(emailService::timingSendEamil).start();/*** 4、拆分*/Runnable runnable = emailService::timingSendEamil;new Thread(runnable).start();/*** 5、使用方法引用調用我們的靜態方法* 格式: 類名::靜態方法*/new Thread(EmailService::staticEamil).start();/*** 6、使用方法引用調用構造方法* 格式: 類名::new*/new Thread(EmailService::new).start();