Lambda使用前提
在java8的新特性中,接口中的方法可以有方法主体,但必须要使用static修饰或default修饰。由此衍生出了一个新的规则:函数式接口
函数式接口: 当接口中有且只有一个抽象方法,但可以有其他的方法
注解:@FunctionInterface 表示该接口为函数式接口,只能由一个抽象方法
Lambda表达式
1.作用
1.简化代码,使代码异常简洁:可以非常优雅的把“一块代码”赋给了一个变量
2.相当于匿名内部类的简写,但不会生成字节码文件
2语法结构
接口名 变量名 = (参数类型 参数名) -> {功能语句};
3语法简写:
简写核心-------要有一个内容去占位
1.可以省略参数类型,因为就只有一个抽象方法,会自动匹配抽象方法中的参数类型
2.当方法体中只有一句代码语句时,可以省略{}。如果有返回值,省略的话要同时省略{}和return。
3.当只有一个参数时,可以**省略()**号
4.如果在lambda表达式中引用了局部变量,默认使用final修饰。因为接口中的常量默认都使用public static final修饰的,所有在函数式接口中使用了过后,默认也会有final修饰
//定义一个函数式接口
@FunctionalInterface
interface LambdaInterfanceTest {
void study(String name);
}
public static void main(String[] args) {
// lambda常规写法 函数式接口名 变量 = (参数类型 参数)->{功能语句};
LambdaInterfanceTest m = (String name) -> {
System.out.println(name + "hello");
};
// Lambda省略参数类型 函数式接口名 变量 = (参数)->{功能语句};
LambdaInterfanceTest m1 = (name) -> {
System.out.println(name + "hello");
};
// Lambda当只有一个参数时可以省略()号 函数式接口名 变量 = 参数->{功能语句};
LambdaInterfanceTest m2 = name -> {
System.out.println(name + "hello");
};
// Lambda当只有一个输出语句时可以省略{},当有返回值时,可以省略的话必须同时省略 {}和return 接口名 变量 = 参数->功能语句;
LambdaInterfanceTest m3 = name -> System.out.println(name + "hello");
String name1 = "帅";
// Lambda中如果使用了局部变量,那么局部变量会默认使用final修饰
LambdaInterfanceTest m4 = name -> System.out.println(name1 + "hello");
}
}