最近回顾了下接口,对比了之前jdk7与jdk8中的区别,为此做一次总结。
接口&函数式接口:
首先,关于接口这个类型做一个简单的介绍。接口其实类似于我们生活中经常会用到的各种插口。比如插座、墙角的那种,它可以为我们提供某项特定的功能,我们只需要在需要的时候使用,并且将一些我们需要的功能重新修改然后再使用,也是非常方便的存在。
在java的jdk7中,也就是java1.7版本里,接口被定义为一个极端抽象类,意思是里面只有抽象方法。对于抽象方法来说,就只有被继承重写和匿名内部类重写了。紧接着在java1.8中,重新对接口进行定义,接口中不仅包含有抽象方法,还可以有被static修饰的静态方法以及被default修饰的默认方法。
静态方法自然不用多说,对于default修饰的默认方法,可以在接口中直接定义方法体,这样可以被子接口直接继承,类在实现此接口时也不用进行重写。使接口与接口、接口与类之间的联系更加紧密。值得注意的是,当两个接口都定义了同一种default的方法签名,那么当一个接口同时继承这两个接口时,这个默认方法就必须要进行重写,因为不清楚到底调用的是哪一个接口中的方法,如图所示:
解决途径:
同时,在1.8中,引入了函数式接口(FunctionalInterface)这个名词。函数式接口指的是一个借口中,有且只有一个抽象方法,那么这个接口就称之为函数式接口。对于函数式接口,我们可以在定义的之前加上@FunctionalInterface来进行检测,如果不符合函数式接口的定义方式,则会报错,如图所示:
此时由于该接口中有两个·抽象方法,所以会报错。
Lambda表达式:
与函数式接口所对应的就是标题中所说的——Lambda表达式了,Lambda表达式的引入使得代码可以更加简洁,但是如果复杂一点看起来也并不是特别容易理解。如图所示:
Lambda表达式的符号是()->,也成为钻石运算符。在上图中,A是一个函数式接口,里面定义了一个抽象方法。在main方法中创建接口的引用,同时在后面使用lambda表达式进行重写。()内是传入的参数名称,->可以理解为实现内部方法,如果重写的方法体只有一句,则可以省略{},如果只有ruturn则return可以省略。在此例中,表示实现的是返回3加上一个int型的bc这个值,所以最后放回结果为12,下图为方法体有多句的情况:
该程序运行结果为13
以上是我对1.8版本的接口以及Lambda表达式的一个简要概括,欢迎补充讨论