资源描述:
《JAVA8十大新特性详解.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JAVA8十大新特性详解本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API“Javaisstillnotdead—andpeopleare startingtofigurethatout。”本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字。一、接口的默认方法ﻫﻫJava8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示
2、例如下:复制代码代码如下:interfaceFormula{ﻫ doublecalculate(inta); defaultdouble sqrt(int a) {ﻫ return Math.sqrt(a);ﻫ }}Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。复制代码代码如下:Formula formula =new Formula() { @Overrideﻫ publicdoublecal
3、culate(int a){ return sqrt(a * 100);ﻫ }};formula.calculate(100); //100.0formula.sqrt(16); //4.0ﻫ文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算 sqrt(a* 100)。在下一节中,我们将会看到实现单方法接口的更简单的做法.译者注: 在Java中只有单继承,如果要让一个类赋予新的特性,通常是使用接口来实现,在C++中支持多继承,允许一个子类同时具有多个父类的接口与功能,在其他语言中,让一
4、个类同时具有其他的可复用代码的方法叫做mixin。新的Java 8的这个特新在编译器实现的角度上来说更加接近Scala的trait。在C#中也有名为扩展方法的概念,允许给已存在的类型扩展方法,和Java8的这个在语义上有差别。ﻫﻫ二、Lambda 表达式ﻫ首先看看在老版本的Java中是如何排列字符串的:复制代码代码如下:List<String〉names=Arrays.asList("peter”,”anna","mike", "xenia”);Collections.sort(names,new Comparator〈String>(){ @Overri
5、de public int compare(Stringa, Stringb){ returnb.compareTo(a);ﻫ }ﻫ});ﻫ只需要给静态方法 Collections。sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。在Java8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:复制代码代码如下:ﻫCollections.sort(names, (Stringa,Stringb)-> { return
6、b.compareTo(a);ﻫ});ﻫ看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:复制代码代码如下:Collections。sort(names,(Stringa,Stringb) ->b.compareTo(a));对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:复制代码代码如下:ﻫCollections。sort(names,(a,b)-〉b.compareTo(a));ﻫJava编译器可以自动推导出参数类型,所以你可以不用再写一次类型。接下来我们看看lambda表达式还能作出什么更方便的东
7、西来:ﻫ三、函数式接口ﻫLambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加@FunctionalInterface注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。示例如下:复制代码代码
8、如下:ﻫ@Functio