一、简介
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
二、表示形式
(parameters) -> expression 或 (parameters) ->{ statements; }
多个语句使用{}括起来
方法( (形参 )-> {
? 语句1;
? 语句2;
} );
2.1无参数
可以明显看出,Lamda表达式比匿名内部类的写法简单许多。(只需要编写核心语句)
public interface MyInterface {
/**
* 测试方法1
*/
//public void test();
/**
* 测试方法2
* @param a
* @param b
* @return
*/
public int getSum(int a,int b);
}
/**
* @Author: 郜宇博
* @Date: 2021/8/31 17:07
* lamda联系
*/
public class LamdaExpressionTest {
public static void main(String[] args) {
//方法一:
mainTest(new MyInterfece() {
@Override
public void test() {
System.out.println("匿名内部类实现");
}
});
//方法二:Lambda表达式
mainTest( ()->{
System.out.println("lambda语句1");
System.out.println("lambda语句2");
});
}
public static void mainTest(MyInterfece myInterfece){
myInterfece.test();
}
}
2.2有参数
public class LambdaExpressionTest {
public static void main(String[] args) {
//方法一:匿名内部类
getSum(new MyInterface() {
@Override
public int getSum(int a, int b) {
return a+b;
}
},2,3);
//方法二:lambda表达式
getSum( (int a,int b)-> {return a+b;},2,3);
}
public static void getSum(MyInterface myInterface , int a, int b){
int res = myInterface.getSum(a,b);
System.out.println(res);
}
}
三、使用
3.1使用外部参数
/**
* @Author: 郜宇博
* @Date: 2021/8/31 17:07
* lamda联系
*/
public class LambdaExpressionTest {
public static void main(String[] args) {
int num = 10;
MyInterface myInterface = (int a,int b)->a+b+num;
int sum = myInterface.getSum(2, 3);
System.out.println(sum);
}
public static void getSum(MyInterface myInterface , int a, int b){
int res = myInterface.getSum(a,b);
System.out.println(res);
}
}
3.2实现线程类的Runable方法
public class LambdaExpressionTest {
public static void main(String[] args) {
new Thread(()-> System.out.println("实现线程的run方法")).start();
}
}
四、注意
-
可以直接在 lambda 表达式中访问外层的局部变量:
-
lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
-
不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误(也说明了lambda表达式使用的外部变量为final修饰的)
- 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。