Lambada表达式是JDK1.8中最重要的新功能之一。使用Lambada表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类。代码看起来更简洁易懂。Lambada表达式同时还提升了对集合、框架的迭代、遍历、过滤数据操作。
特点:函数式编程、参数类型自动推断,代码量少、简洁
先小试牛刀,新建一个线程和一个集合的排序的两种写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread is running");
}
}).start();
new Thread(()->{
System.out.println("thread is running");
}).start();
List<String> stringList1 = Arrays.asList("a","abc","ab");
Collections.sort(stringList1, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
System.out.println(stringList1);
List<String> stringList2 = Arrays.asList("a","abc","ab");
Collections.sort(stringList2,(a,b)-> a.length() - b.length());
System.out.println(stringList2);
学好Lambada表达式的诀窍:1.熟悉泛型 2.正常的开发多练,多用Stream API。只要是任何有函数式接口的地方都可以用Lambada(只有一个抽象方法的接口就是函数式接口)
只要JDK接口上面有@FunctionalInterface注解的接口都是函数式接口。
更多的可以查看jdk java.util.function包下面的接口,该包下面的接口都是函数式接口。
介绍几个比较常用的 Supplier 代表一个输出,Consumer 代表一个输入,Function代表一个输入一个输出(输入和输出类型不相同,也可以相同)。BiConsumer代表两个输入。UnaryOperator 代表一个输入一个输出(输入和输出类型相同)。BiFunction代表两个输入一个输出。BinaryOperator代表两个输入一个输出(输入输出类型相同)---这些基本的函数式接口应当熟练牢记,其余的接口都是在此基础上扩展的比如DoubleConsumer代表输入的是一个Double类型的。
那么Lambada的语法 : LambadaParameters -> LambadaBody
args -> expr或者(Object...args)->{函数式接口的抽象方法实现逻辑},()里面参数的个数,是根据函数式接口里面抽象方法的参数个数来决定的,当只有一个参数的时候()可以省略,当expr逻辑非常简单的时候{}和return可以省略
比如:()->{}无参,无返回值
()->{System.out.println(1);
}无参,无返回值
()->System.out.println(1);
无参,无返回值
()->{return 100};
无参,有返回值
()->return 100;
无参,有返回值
()->100;
无参,有返回值
()->null;
无参,有返回值
x->x+1有参,有返回值
Lambada虽然可以做参数推断,但是当有多个入参的时候不可以有的写参数类型有的不写参数类型,另外参数类型不能用final来修饰。不能把Lambad表达式赋给一个非函数式接口。不需要也不容许使用throws语句来声明它可能会排除的异常
更多的语法见Lambad官方文档 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27