JDK 8 新特性 之 方法引用

Scroll Down

概述


  • 方法引用:当要传递给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() {
            @Override
            public 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();