# Lambda 概述
# 函数式编程思想
- 拿数据做操作,有悖于面向对象操作
- 强调做什么,而不是过程
# Lambda 使用前提
- 有一个接口
- 接口只有一个抽象方法
# Lambda 标准格式
(形式参数) -> {代码块}
- ():形式参数
- ->:箭头
- {}:代码块
# Lambda 使用
# 无参无返
| public interface Test1 { |
| void domain(); |
| } |
| public class Demo1 { |
| public static void main(String[] args) { |
| doDoMain(() -> System.out.println("domain")); |
| } |
| public static void doDoMain(Test1 t) { |
| t.domain(); |
| } |
| } |
# 带参无返
| public interface Test { |
| void domain(String s); |
| } |
| public class Demo { |
| public static void man(String[] args) { |
| doDoMain((String s) -> { |
| System.out.println(s); |
| }); |
| doDoMain((s) -> System.out.println(s)); |
| doDoMain(s -> System.out.println(s)); |
| } |
| public static void doDoMain(Test t) { |
| t.domain("domain"); |
| } |
| } |
# 带参有返
| public interface Test { |
| int add(int a, int b); |
| } |
| public class Demo { |
| public static void main(String[] args) { |
| doAdd((int a, int b) -> { |
| return a + b; |
| }); |
| doAdd((a,b) -> a + b); |
| } |
| public static void adAdd(Test t) { |
| int sum = t.add(10,20); |
| System.out.println(sum); |
| } |
| } |
# 使用说明
# Lambda 的实现
先使用方法,后定义方法体
# 关于 Lambda 的省略
- 形式参数类型可以省略,但是尽量不要省
- 形式参数如果有一个可以省略小括号
- 代码块如果只有一条,可以省略大括号 (对于 return 语句,需要省略掉 return)
# 上下文环境
必须有上下文环境,才能导出 lambda 响应接口
- 局部变量的赋值
- 调用方法的参数
# Lambda 与匿名内部类的区别
# 所需类型不同
- 匿名内部类:接口、抽象类、具体类
- Lambda:接口
# 使用限制不同
- 匿名内部类:无抽象方法个数限制
- Lambda:只能有一个抽象方法
# 实现原理不同
- 匿名内部类:产生一个 class 字节码文件
- Lambda:字节码动态生成