一、Lambda优化以下问题
1.解决原有匿名内部类语法冗余问题
2.解决作用域指向不明确问题
3.解决多余代码产生的“高度”问题
二、函数式接口
1.Java API中有的接口只有一个方法,大多数回调接口都拥此个特征:比如Runnable接口和Comparator接口。因此只拥有一个方法的接口称为函数式接口;
2.lambda为了使匿名接口不在产生冗余代码,使用“箭头”结构表示匿名接口(以下会有示例),同时JAVA SE 8中新增java.util.function包提供了常用的函数式接口:
Predicate——接收T对象并返回boolean
Consumer——接收T对象,不返回值
Function——接收T对象,返回R对象
Supplier——提供T对象(例如工厂),不接收值
UnaryOperator——接收T对象,返回T对象
BinaryOperator——接收两个T对象,返回T对象
三、使用和特性
1.语法:lambda 表达式的语法由 【(参数列表)箭头符号-> {函数体};】组成,例:(String s) -> { System.out.println(s); }
2.函数式接口的类型自动推导:
lambda可自动推导目标类型
例:JavaSE7中的对象:
JavaSE8 lambda简化后:
*同样的函数体,但表示了不同的类型;第一个lambda表达式【() -> "done"】是Callable的实例,而第二个lambda表达式【() -> "done"】则是PrivilegedAction的实例。
3.当函数体有返回值时,可省略“return”关键字,省略”;”分号
例1:接收一个参数(y),返回其2倍的值
( y ) -> 2 * y
例2: 一个接收String和Object并返回int的函数类型可以被表示为
(String,Object) -> int
4.简化过程
*当只有一个参数时,可省略类型
*当只有一行代码语句时可省略分号和 { },多行语句时不可省略
*当只有一个返回值时可省略return
(String x)->{ System.out.print( x ); }
可简化为:(x)-> System.out.print( x )
5. 词法作用域
*在lambda函数体中,“this”会指向外部,且不会继承超类的变量。
6. lambda 表达式对 值 封闭,对 变量 开放:
四、JDK1.8其它相关
1.lambda集合遍历:
*List集合:
list.forEach(c->System.out.println(c));
*map集合
map.forEach((key,value)->System.out.println("key:" + key + " value:" + value));
2.方法引用
Java SE8
提供的方法引用有很多种,需要在类名或对象与方法之间加入双冒号“::“表示,它们的语法如下:
静态方法引用:ClassName::methodName
实例上的实例方法引用:instanceReference::methodName
超类上的实例方法引用:super::methodName
类型上的实例方法引用:ClassName::methodName
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new