lambda的无参形式
public class Test2{
public static void main(String[] args) {
//匿名内部类形式创建线程
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
//lambda表达式创建线程
new Thread(
()->System.out.println(Thread.currentThread().getName())
).start();
}
}
上面分别通过匿名内部类和lambda表达式创建了两个线程。
- 匿名内部类需要显示new一个Runnable并重写抽象方法。
- lambda不需要接口名和方法名,写出实现方法体即可,编译器会自动去识别。但是前提是接口为函数接口,即只有一个抽象方法。函数接口一般会加上@FunctionalInterface注解。如Runnable接口只有一个抽象方法run,()->默认重写run方法。
lambda的有参形式:
List<Integer> arr = Arrays.asList(1,6,2,8,4,3,10,9);
//lambda形式实现Comparator接口的实现,自定义排序方式(降序)
Collections.sort(arr, (a, b) -> {return b-a;});
//匿名内部类形式实现上一行代码功能
Collections.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2){
return o2-o1;
}
});
可见使用lambda方式要简洁得多。省去了泛型、参数数据类型、接口名、方法名等书写,而这些编译器会自动为我们添加上。
lambda与匿名内部类区别:
- 匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可;但 Lambda
表达式只能为函数式接口创建实例。 - 匿名内部类可以为抽象类甚至普通类创建实例;但 Lambda 表达式只能为函数式接口创建实例。
- 匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;但 Lambda 表达式的代码块不允许调用接口中定义的默认方法。
总体来说lambda的局限性更多,使用的地方有限