JDK8新特性-lambda表达式
package com.zenqgifeng.practicedemo.lambda;
/**
* @author zengqifeng
* @version 1.0
* @date 2019/12/31 11:25
* lambda表达式的作用其实和匿名内部类一样 最终都是重写方法,创建了该接口的子类及子类对象传递给调用方
* 所以只要接收方是函数式接口类型,就可以使用lambda表达式
*
* lambda表达式替代的就是函数式接口类型,使用的场景有
* 方法的参数是函数式接口 methodName(()->{})
* 变量是函数式接口类型 Function function = ()->{};
*
* lambda表达式只关心参数列表以及是否有返回值
*
* 1、lambda表达式前提条件:函数式接口
* 方法参数或者变量类型是接口
* 接口中只有一个抽象方法
* 满足以上两个条件的接口称之为 函数式接口
* 可用@FunctionInterface来检测接口是否是函数式接口,不是函数式接口 该注解会报错
*
* 2、lambda表达式标准写法()->{},还可以简写
* 参数的类型可以省略
* 当参数只有一个时可以省略括号
* 当方法体中只有一条语句时,{},return,和;三者可省略(注意,三者要么不省略,要么必须全部省略)
* 3、参数为接口时可考虑使用lambda表达式替代
*
* 4、匿名内部类和lambda表达式的比较
* 类型
* 匿名内部类:实现类,抽象类,接口
* lambda表达式只针对接口类型
* 抽象方法个数
* lambda表达式要求接口中只能有一个抽象方法
* 原理
* 匿名内部类:在编译阶段生成class文件
* lambda表达式:程序运行期间动态生成class文件
*
* 匿名内部类在《编译阶段》时会生成内部类的二进制文件 带有$的class文件
* 反编译后可知该类继承接口并重写了方法
*
* lambda表达式在程序 《运行阶段》
* 在lambda表达式当前类中生成一方法,方法体内容就是lambda表达式中内容
* (程序运行)同时生成一个内部类 带$的class文件,反编译后可知
* 该匿名内部类实现接口并重写方法,重写的方法调用的就是前面生成的那个方法
*/
public class Demo1 {
/**
* lambda表达式标准使用
* 可替代匿名内部类中方法 匿名方法
* lambda表达式标准使用方式
* 有参方法,无参方法皆可
* (方法参数)-> {匿名函数体}
*/
public static void main(String[] args) {
/**
* 匿名内部类生成Runnable接口的匿名子类
* 重写接口run方法
* 创建子类匿名对象
* 关注点:run方法的参数和方法体
*/
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类方式");
}
}).start();
System.out.println("----------------");
/**
* lambda表达式
* 参数是接口的都可以考虑使用lambda表达式
*/
new Thread(() -> {
System.out.println("lambda表达式----匿名函数");
}).start();
System.out.println("----------------");
/**
*lambda表达式简写形式
*/
new Thread(() -> System.out.println("lambda表达式----匿名函数")).start();
}
}