Java8对java的语法又进行了比较大的扩充,主要是增加了函数式接口以及Lambda表达式,以支持流行的函数式编程。本文对此进行一些介绍。
一.Java8接口的变化
1.增加了default方法和static方法,这两种方法必须有方法体。default方法属于实例,static方法属于类(接口)。static方法是不能被继承的,但是static变量是可以被继承的。注意接口中的default方法和static方法都是public型的。接口里可以写static方法了,就意味着可以写main方法了,但是通常不这么干。
2.父接口的抽象方法,在子接口中可以使用default方法实现。同样父接口的default方法,在子接口中可以重写为抽象方法。
3.如果一个类实现了两个(以上)接口,并且这两个接口相互之间没有继承关系。如果这两个接口存在相同的default方法,编译会报错。如果这两个接口有继承关系,default方法会被子接口覆盖。如果必须继承两个(以上)没有继承关系的接口,并且存在相同的default方法,实现类可以通过特殊语法指定要访问哪个接口的方法。在实现类或子接口中重写该default方法,在方法里面使用以下语法:<接口名>.super.<方法名>([参数]..);
3.如果一个接口只有一个抽象方法(包括继承的),该接口是一个函数式接口。函数式接口可以使用Lambda表达式实现。如果使用@FunctionalInterface注解接口,则限定该接口必须是函数式接口,有且仅有一个抽象方法,但是可以有多个default方法和static方法。
特别注意:Java8之前,在内部类里面只能访问final的局部变量。从Java8开始,如果在内部类里面访问局部变量,会自动给局部变量加上final修饰,该局部变量将不能再修改。
二.Lambda表达式
Lambda 表达式允许我们定义一个匿名的方法,并将它作为 Functional interface 的一个实例。Lambda表达式可以认为是一种特殊的匿名内部类,但它并不会真的编译出一个class文件。
Lambda表达式只能应用于函数式接口,基本操作符如下:
() : 表示参数列表,不需要指定参数的类型,会自动推断
-> : 连接符
{} : 表示方法体
基本语法:
([形参列表]) -> {
//执行语句,方法体
[return ...;]
}
1.形参列表,不带参数类型,Lambda表达式自动推断数据类型。
2.如果形参列表是空的,只保留()即可。
3.如果只有一个形参,()可以省略,只需要参数的名称即可。
4.如果执行语句只有一行,可以省略{},但是有返回值时,有点特殊。
5.如果有返回值,且执行语句只有一行,可以省略{},但必须将return关键字也省略,这也是允许的,但不建议这样做。
三.方法引用
方法引用跟 Lambda 表达式很像,他们都需要一个目标类型,但是不同的是方法引用不提供方法的实现,他们引用一个已经存在的类或者对象的方法。
引用方法:
引用类方法
<类名>::<类方法名>
把调用函数式接口方法的所有参数都传递给引用的类方法。
引用实例方法
<实例名>::<实例方法名>
把调用函数式接口方法的所有参数都传递给引用的实例方法。
通过类引用实例方法
<类名>::<实例方法名>
把函数式接口方法的第一个参数,作为类的一个实例。
函数式接口方法的参数中,第一个参数必须是::前面的类名的一个实例。
引用构造器方法
<类名>::new
把调用函数式接口方法的所有参数都传递给引用的构造器方法。
技术更新的好快呀!这正说明了这个行业的活力,我很幸运能从事这个行业,但也确实感到了很大压力,学习技术是一件吃苦的事,真不容易呀。但必须坚持,不能放弃,君子一诺!