什么是Lambda表达式
可以理解为一种匿名函数的代替,lambda允许将函数作为一个方法的参数传递,从而简化代码编写。
什么是函数式接口
lambda表达式需要函数式接口的支持
所谓函数式接口,是指只有一个抽象方法
另外JDK8也提供了一个注解,帮助我们编译时检查语法是否符合@FunctionInterface
Lambda表达式的基本语法
函数式接口 变量名 = (参数1,参数2...)->{
方法体
}
lambda应用实例1public class Demo {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("run");
}
};
new Thread(runnable).start();
//第一种方式,主要内容就只有参数列表和方法体了
Runnable runnable1 = ()->{
System.out.println("hello");
};
new Thread(runnable1).start();
//第二种方式
new Thread(()->{
System.out.println("hello xz");
}).start();
//第三种方式,还可以更省,只有一条语句时,{}也可以省去
new Thread(()-> System.out.println("hi ")).start();
}
}
代码简述:lambda基本语法
lambda应用实例2public class Demo2 {
public static void main(String[] args) {
//传统方式用匿名内部类创建比较器
Comparator comparator = new Comparator() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
TreeSet treeSet = new TreeSet<>(comparator);
//lambda表达式,这里o1,o2也不用写类型了,写类型是多余的,因为在前面泛型里面写了String
Comparator comparator1 = (o1,o2)-> o1.length()-o2.length();
TreeSet treeSet1 = new TreeSet<>(comparator1);
//利用lambda表达式的更简单写法
TreeSet treeSet2 = new TreeSet<>((o1,o2)->o1.length()-o2.length());
}
}
lambda表达式总结:
lambda引入了新的操作符:->将表达式分为了两个部分
左侧:(参数1,参数2...)表示方法的参数列表
右侧:{}内部是方法体
1.形参列表的数据类型会自动判断,因为有泛型指明
2.如果形参列表为空,只保留()
3.如果形参只有一个,()可以省略,只需要参数的名称即可
4.如果执行语句只有一句,则无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句保证只有一句
5.lambda不会生成一个单独的内部类文件
6.lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后修改局部变量会报错,这一点匿名内部类的使用规则



