1.Lambda表达式
1.1 介绍
Lambda可以理解为一个匿名函数,我们可以把其表达式理解为是一段可以传递的代码,可以写出更简洁、更灵活的代码
1.2 对比
@Test
public void test1(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1 , o2);
}
};
}
@Test
public void test2(){
Comparator<Integer> comparator = (o1 , o2)->Integer.compare(o1 , o2);
}
1.3 举个栗子
public class LambdaTest {
@Test
public void test3(){
LambdaTest lambdaTest = new LambdaTest();
MathOperation addition = (o1 , o2) -> o1 + o2;
int operate = lambdaTest.operate(10, 20, addition);
System.out.println(operate);
}
private int operate(int o1 , int o2, MathOperation mathOperation){
return mathOperation.operation(o1 , o2);
}
interface MathOperation {
int operation(int o1 , int o2);
}
}
1.4 语法格式
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需要执行的功能 (Lambda体)
语法格式一:无参数,无返回值
() -> Sysout.out.println("Test");
语法格式二:有一个参数,并且无返回值
(X)-> Sysout.out.println(x);
语法格式三:如果有一个参数括号可以不写
X-> Sysout.out.println(x);
语法格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句 语法体中需要用{}
Comparator<Integer> comparator = (o1, o2) -> {
System.out.println("Test");
return Integer.compare(o1, o2);
};
语法格式五:Lambda体中只用一条语句,return和{}可以省略不写
Comparator<Integer> comparator = (o1, o2)->Integer.compare(o1, o2);
语法格式六:表达式的参数列表的数据类型可以省略不写,JVM编译器通过上下文推断出数据类型
(x ,y ) ->Integer.compare(x ,y)
1.5 注意–变量和作用域
1.lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda
内部修改定义在域外的局部变量,否则会编译错误。
2.lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
(即隐性的具有 final 的语义)
3.在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。