Lamdba表达式
-
lambda表达式允许把函数作为一个方法的参数;
-
使用lambda表达式可以使代码变得更加简洁紧凑
lambda表达式使用的前提是实现的接口中只有一个必须要实现的方法
在Java8中,接口中有通过default修饰的默认实现方法,即这个方法具有默认的实现,实现类可以按需要重写default方法
语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)
? 可以参考这篇博文:https://www.cnblogs.com/haixiang/p/11029639.html#228891873
在lambda表达式中的一些省略写法:
- ()中参数类型符可以省略;
- ()中的参数如果只有一个,则可以将()省略;
- 如果 { } 中只有一条语句,则可以将大括号省略
- 如果{ }中,直接返回值则可以将return省略
lambda表达式可以指定一个普通方法来快速的实现接口中的抽象方法,但是要求两个方法的返回类型,输入参数类型和数量相同才可,其使用方法为:
- 方法拥有者::方法名
静态方法的拥有者是这个类,而非静态方法的拥有者则是类的实例化对象
lamabda表达式可以很方便的用于实现接口的匿名内部类方法重写,典型的就是线程的创建;
pulic class Resolve{
public static void main(String [] args) {
Thread thread = new Thread (()->{
for(int i=0;i<10;i++){
System.out.println("i++");
}
});
thread.start();
}
}
//因为在实例化thread的时候,其构造方法中的参数是实现Runnable接口的类,而实现该接口必须重写其run方法,run方法的是无参数无返回值的,所以lambda形式即如上所示
lambda表达式也可以用于集合的遍历、排序和删除,能够使代码更简洁
- 遍历集合的时候是借助于集合实现类的forEach()方法,其本质是在该方法中传入实现Consumer接口的实例对象,排序是借助sort(),删除是借助removeIf()方法传入实现Predicate接口的实例对象
- 其实本质上还是通过lambda表达式来简易的创建实现接口的匿名内部类,并重写其中的方法;因为在必须实现这个接口的情形下,一些创建匿名内部类的代码确实是可以省略,而着重关注其重写的方法体和参数。