1.JAVA 8 新特性
- Lambda表达式:Lambda允许把函数作为一个方法的参数;
- 方法引用:方法引用提供了非常有用的语法,可以直接引用已有JAVA类或对象的方法或构造器。与Lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
- 默认方法:接口里面有了一个实现的方法,目的是为了解决接口的修改与现有实现的不兼容问题;
- Stram API:把函数式编程引入到了JAVA中;
- Date Time API:加强对日期与时间的处理;
- Optional类:解决空指针异常;
- Nashorn,JAVAScript引擎:JAVA8提供一个新的Nashorn JAVAScript引擎,它允许我们在JVM上允许特定的JAVAScript应用;
2.Lambda表达式
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中);
(parameters) -> expression
(parameters) -> {statements;}
重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值;
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号;
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号;
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回一个数值;
变量作用域:Lambda表达式只能引用标记了final的外层局部变量,不能在Lamdba内部修改定义在域外的局部变量,否则编译报错;并且在Lamdba表达式中不允许声明一个与局部变量同名的参数;
3.方法引用
方法引用通过方法的名字来指向一个方法,使语言的构造更加紧凑简洁,减少冗余代码,使用一对冒号::
- 构造器引用:
Class::new/Class<T>::new
- 静态方法引用:
Class::static_method
- 特定类的任意对象方法引用:
Class::method
- 特定对象的方法引用:
instance::method
4.函数式接口
函数式接口就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口;可以被隐式的转换为Lambda表达式,且支持Lambda表达式。也就是接口中声明了一个抽象方法,在使用前需要先实现该方法(可通过Lamdba定义实现),然后具有一些实体方法(默认方法,default修饰)调用了该抽象方法来实现相应的逻辑。