函数式接口
在了解Lambda表达式之前 , 要先了解什么是函数式接口 .
当一个接口只有一个必须重写的抽象方法时 , 该接口称为函数式接口 , 使用注解@FunctionalInterface 来对函数式接口作为规范和限制 , 比如当有两个必须重写的抽象方法时 , 添加该注解会自动报错提示 .
Lambda表达式
Lambda表达式是对匿名内部类的简化 , 只有函数式接口的匿名内部类 , 才可以使用Lambda表达式及进行简化 , 对于普通接口或者类的匿名内部类 , 无法使用Lambda表达式 .
格式
( 参数 ) -> { 代码块 }
匿名内部类的省略
- 参数类型可以省略 , 如果有多个参数 , 那么所有参数类型要么都省略 , 要么不省略
- 当只有一个参数时 , () 可以省略 , a -> { }
- 当代码块只有一句话时 , { }可以省略 , 注意去掉代码的分号 ( 不推荐 )
匿名内部类和Lambda表达的区别
- 所需类型 : 匿名内部类可以是接口 , 抽象类 , 具体类 , 但是lambda表达式只能是函数式接口
- 使用限制 : 匿名内部类可以有多个重写的抽象方法 , 函数式接口只能有一个必须重写的抽象方法
- 实现原理 : 匿名内部类在编译之后 ,会产生一个单独的字节码文件 , lambda表达式在编译之后没有单独的字节码文件 , 对应的字节码文件在运行的时候动态生成