概述


  • 方法引用:当要传递给Lambda体的操作,已经有实现的方法了,就可以使用方法引用
  • 方法引用:在Lambda的基础上进一步的简化。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
  • 要求:实现接口的抽象方法体的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致
  • 使用操作符 :: 将类(或对象)与方法名分割开来
  • 主要分为下面三种使用情况:
    1. 对象 :: 实例方法名
    2. 类 :: 静态方法名
    3. 类 :: 实例方法名
场景:模拟发送邮件
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();