今天总结了下最近看的关于lambda的知识,加深一下对lambda的理解。
1.什么是lambda?lambda表达式可以看做是匿名类的简便的语法。
他有两种语法:(parameters->expression)和(parameters->{statements;}。如(String s) -> s.length() 和(String s) -> {return s.length();}
2.在哪里以及如何使用lambda?
lambda表达式返回的实际上是函数式接口(只有一个抽象方法的接口)的实例,可以将lambda值赋给变量,也可以作为函数参数传递。
lambda表达式的签名要和函数式接口的抽象方法的签名一致。
3.常见的几种函数式接口
Predicate<T>、Consumer<T>和Function<T,R>,这几个几口都在function包中。另外常见的函数式接口还有:Comparator<T>、Runnable和Callable<T>。
由于装箱和拆箱会影响性能,所以lambda还有几个Predicate<T>、Consumer<T>和Function<T,R>关于原始类型的变形,主要对应int、long和double。
4.类型检查和类型推断
lambda表达式并没有声明要实例化的接口,它的目标类型是通过上下文来推断出来的。推断过程是先根据变量或参数类型获取目标类型,然后再根据lambda表达式的函数描述符是否和函数式接口的抽象方法的签名一致来检查的。
可以根据目标类型和接口式函数的抽象方法来推断lambda表达式参数的类型的。
5.方法引用和构造函数引用
什么时候使用使用方法引用?在直接调用某个方法时可以使用方法引用。
如何使用方法引用?::前面为为目标引用,后面为方法的名称。
如何构建方法引用?(1)指向静态方法的方法引用,如Integer::parseInt。(2)指向任何类型实例方法的方法引用,如s->s.length()可以表示未S::length。(3)指向现有对象的实例方法的方法引用。
构造函数引用:如Integer::new