java8简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2015年公司发展迅速,于是大量的时间花费在招聘上。
招聘工程师,必然需要了解候选人的技术能力,尤其是对自己使用的技术的了解程度。
优秀的工程师都需要知其然,也知其所以然,否则遇到技术难题就只能呵呵了。
而对于面试官来讲,如果想要了解候选人的真实技术水平,自己也需要对技术有足够的了解。
最近两年由于琐事越来越多,更多的时间是关注大数据的一些技术的发展,可是一些曾经自己很关注的技术却有些生疏了,比如Java语言和Java虚拟机的一些发展情况。
2016年,决定每周花些时间来了解更为基础的技术,这两年往外倒的多,需要冲些电进来了。
Java 9已经快出来了,不过Java 8我却还没有足够的了解,先从Java 8开始,逐渐重试基础知识。
Java Interface的变化
在面试一些初级程序员时,我经常会问他们关于Java Interface和abstract class的一些区别。
在Java 8以前,Interface中只能存在抽象方法,可是在Java 8之中,Interface有了变化,引入了Default Methods,所谓默认方法。
在Interface中,可以将具体的方法的实现用default 关键字来修饰,这样就可以实现多继承了。
例如,我定义一个IHelloWorld接口,其中sbSayHello这个方法我希望所有实现这个接口的类都可以继承使用,我就可以这样定义接口:
其中sayHello会要求继承的类去实现它,而sbSayHello则可以被直接实现的类继承使用。
比如:
另外,对于接口,我也可以匿名对象,例如:
这个时候,Java 8中会建议用lambda表达式来进行匿名的实现,因为lambda表达式更为简洁。
Lambda表达式
随着Spark越来越火爆,Scala语言也有了越来越多的使用者,Scala语言作为函数式编程语言,函数是一等公民。
而Java作为一个具有超过20年历史的老语言,也在与时俱进的引入新的特性,比如Lambda表达式。
在Java当中,lambda表达式本质上就是一个你们方法的实现,只不过更简洁。
比如,上边的匿名函数的实现,就可以变为:
这个表达方法已经很像Scala语言的实现了。
在Java 8中,如果要用Lambda表达式,需要它的目标类型是函数接口(Functional Interface)。
具体来说,一个Interface只能有一个抽象方法,比如我前面的IHelloWorld就只有一个抽象方法sayHello。
为了保证接口是函数接口,Java 8引入了一个叫做FunctionalInterface的Annotation,用于修饰接口,比如前面接口的定义可以改为:
这个时候,你如果尝试再增加一个抽象接口,编译器就会报错。
Method Reference
Java 8引入了一个方法引用method reference的概念,方法引用通过"::"来表达,比如如下的例子:
另外,方法引用可以引用对象方法以及类的构造方法。
比如引用对象方法:
定义一个工厂接口DeviceFactory:
在生成Device的时候,可以用如下的代码:
Java 8的lambda表达式、方法引用等等特性使得Java开始逐渐的支持了函数式语言的一些特性,而Java 8的实现中,有一些已经支持的函数接口,从而方便之处Lambda表达式,后边再逐一进行研究。