一,概念
-
**作用:**Lambda表达式用于简化匿名内部类的语法
/* 创建一个线程 */ //使用内部类 class Th extends Thread{ @Override public void run() { System.out.println("A"); } } Th t = new Th(); //创建线程对象 t.start(); //启动线程 //使用匿名内部类 new Thread(){ @Override public void run() { System.out.println("A"); } }.start(); //使用Lambda表达式写法 new Thread(() -> System.out.println("A")).start();
二,函数式接口
-
概念:只有一个待实现方法的接口,就叫做函数式接口
-
**判断:**使用
@FunctionalInterface
去断言这个接口是函数式接口@FunctionalInterface interface Fly{ void fly(String name); }
三,Lambda表达式
-
使用:Lambda表达式去简化一个接口的匿名类实现方式,它只能对函数式接口起作用
(如果一个接口有多个待实现的方法,Lambda表达式就不能分辨出它现在是对接口中哪个方法进行实现)
-
"
->
"操作符:即Lambda操作符,它将Lambda分为两个部分
- 左侧:指定了Lambda表达式需要的所有参数
- 右侧:指定了Lambda体,即Lambda表达式要执行的功能
-
特征
-
可选类型声明:Lambda表达式可以不用声明实现方法的参数类型
MathOperation addition = (int a, int b) -> a + b; // 类型声明 MathOperation subtraction = (a, b) -> a - b; // 不用类型声明
-
**可选的参数圆括号:**一个参数无需定义圆括号,但没有参数或者多个参数需要定义圆括号
// 不用括号 GreetingService greetService1 = message -> System.out.println("Hello " + message); // 用括号 GreetingService greetService2 = (message) -> System.out.println("Hello " + message); new Thread(() -> System.out.println("A")).start();
-
**可选的大括号:**如果主体包含了多个语句,就需要使用大括号
// 多条语句不可以省略大括号 MathOperation multiplication = (int a, int b) -> { int num = a+1; num = a + b; return a * b + num; }; // 单条语句可以省略大括号 MathOperation division = (int a, int b) -> a / b;
-
**可选的返回值:**如果主体只有一个表达式则编译器会自动返回值,此外需要使用
return
语句// 多条语句的Lambda表达式如果有返回值,需要使用return MathOperation multiplication = (int a, int b) -> { int num = a+1; num = a + b; return a * b + num; }; // 单条语句可以省略return MathOperation division = (int a, int b) -> a / b;
-
-
更多用法
-
为变量赋值
MathOperation subtraction = (a, b) -> a - b;
-
作为return结果
MathOperation getOperation(int a, int b){ return (a1, b1) -> a+b; }
-
作为数组元素
MathOperation math[] = { (a,b) -> a+b, (a,b) -> a-b, (a,b) -> a*b };
-
作为普通方法或构造方法的参数
-
-
**Lambda表达式的作用域范围:**Lambda表达式的表达体内,可以访问表达体外的变量,但无法对其进行修改操作
-
Lambda表达式的引用写法:如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用