Lambda表达式可以看成是匿名内部类,使用Lambda表达式时,接口必须是函数式接口。
函数式接口在Java中是指: 有且仅有一个抽象方法的接口(接口中抽象方法的public abstract 是可以省略的)
基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
说明:
(参数1,参数2…)表示参数列表;->表示连接符;{ }内部是方法体
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果参数列表为空,只需保留();
3、如果参数只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{ }可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、参数列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;
示例代码:
public interface LambdaTest {
abstract void print();
}
public interface LambdaTest2 {
abstract void print(String a);
}
public interface DefalutTest {
static int a =5;
default void defaultMethod(){
System.out.println("DefalutTest defalut 方法");
}
int sub(int a,int b);
static void staticMethod() {
System.out.println("DefalutTest static 方法");
}
}
public class Main {
public static void main(String[] args) {
//匿名内部类--java8之前的实现方式
DefalutTest dt = new DefalutTest(){
@Override
public int sub(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
};
//lambda表达式--实现方式1
DefalutTest dt2 =(a,b)->{
return a-b;
};
System.out.println(dt2.sub(2, 1));
//lambda表达式--实现方式2,省略花括号
DefalutTest dt3 =(a,b)->a-b;
System.out.println(dt3.sub(5, 6));
//测试final
int c = 5;
DefalutTest dt4 =(a,b)->a-c;
System.out.println(dt4.sub(5, 6));
//无参方法,并且执行语句只有1条
LambdaTest lt = ()-> System.out.println("测试无参");
lt.print();
//只有一个参数方法
LambdaTest2 lt1 = s-> System.out.println(s);
lt1.print("有一个参数");
}
}
局部变量修改报错如图:

原文:https://www.cnblogs.com/wffzk/p/14839301.html