java8新特性培训ppt

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Java8新特性指南Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8,它支持函数式编程,新的JavaScript引擎,新的日期API,新的StreamAPI等。本次培训简述18个新特性。Lambdas表达式Lambda表达式(也称为闭包)是整个Java8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据:函数式程序员对这一概念非常熟悉。在JVM平台上的很多语言(Groovy,Scala,……)从一开始就有Lambda,但是Java程序员不得不使用毫无新意的匿名类来代替lambda。实例:Arrays.asList(a,b,d).forEach(e-System.out.println(e));Arrays.asList(a,b,d).sort((e1,e2)-e1.compareTo(e2));Arrays.asList(a,b,d).sort((e1,e2)-{intresult=e1.compareTo(e2);returnresult;});Functional接口函数式接口就是一个具有一个方法的普通接口。像这样的接口,可以被隐式转换为lambda表达式。java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的两个例子。在实际使用过程中,函数式接口是容易出错的:如有某个人在接口定义中增加了另一个方法,这时,这个接口就不再是函数式的了,并且编译过程也会失败。为了克服函数式接口的这种脆弱性并且能够明确声明接口作为函数式接口的意图,Java8增加了一种特殊的注解@FunctionalInterface(Java8中所有类库的已有接口都添加了@FunctionalInterface注解)。实例:1:@FunctionalInterfacepublicinterfaceFunctionalDefaultMethods{voidmethod();defaultvoiddefaultMethod(){}}2://Java8之前:newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println(BeforeJava8);}}).start();//Java8方式:newThread(()-System.out.println(InJava8,Lambda)).start();接口的默认方法与静态方法Java8用默认方法与静态方法这两个新概念来扩展接口的声明。默认方法使接口有点像Traits(Scala中特征(trait)类似于Java中的Interface,但它可以包含实现代码,也就是目前Java8新增的功能),但与传统的接口又有些不一样,它允许在已有的接口中添加新方法,而同时又保持了与旧版本代码的兼容性。默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有这个要求。相反,每个接口都必须提供一个所谓的默认实现,这样所有的接口实现者将会默认继承它(如果有必要的话,可以覆盖这个默认实现)。privateinterfaceDefaulable{defaultStringnotRequired(){returnDefaultimplementation;}}privatestaticclassDefaultableImplimplementsDefaulable{}privatestaticclassOverridableImplimplementsDefaulable{@OverridepublicStringnotRequired(){returnOverriddenimplementation;}}接口静态方法构造方法调用publicclassCar{publicstaticCarcreate(finalSupplierCarsupplier){returnsupplier.get();}publicstaticvoidcollide(finalCar){System.out.println(Collided+car.toString());}publicvoidfollow(finalCaranother){System.out.println(Followingthe+another.toString());}publicvoidrepair(){System.out.println(Repaired+this.toString());}publicstaticvoidmain(String[]args){finalCar=Car.create(Car::new);//构造函数调用finalListCarcars=Arrays.asList(car);cars.forEach(Car::collide);//静态函数调用cars.forEach(Car::repair);//特定类的函数函数调用finalCarpolice=Car.create(Car::new);cars.forEach(police::follow);//特定函数调用}}重复注解自从Java5引入了注解机制,这一特性就变得非常流行并且广为使用。然而,使用注解的一个限制是相同的注解在同一位置只能声明一次,不能声明多次。Java8打破了这条规则,引入了重复注解机制,这样相同的注解可以在同一地方声明多次。重复注解机制本身必须用@Repeatable注解。publicclassRepeatingAnnotations{@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public@interfaceFilters{Filter[]value();}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Repeatable(Filters.class)public@interfaceFilter{Stringvalue();};@Filter(filter1)@Filter(filter2)publicinterfaceFilterable{}publicstaticvoidmain(String[]args){for(Filter:Filterable.class.getAnnotationsByType(Filter.class)){System.out.println(filter.value());}}}类型推测机制publicclassValueT{publicstaticTTdefaultValue(){returnnull;}publicTgetOrDefault(Tvalue,TdefaultValue){return(value!=null)?value:defaultValue;}publicstaticvoidmain(String[]args){finalValueStringvalue=newValue();value.getOrDefault(22,Value.defaultValue());}}Java7中,相同的例子将不会通过编译,正确的书写方式是Value.StringdefaultValue()扩展注解的支持Java8扩展了注解的上下文。现在几乎可以为任何东西添加注解:局部变量、泛型类、父类与接口的实现,就连方法的异常也能添加注解。publicclassAnnotations{@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE_USE,ElementType.TYPE_PARAMETER})public@interfaceNonEmpty{}publicstaticclassHolder@NonEmptyTextends@NonEmptyObject{publicvoidmethod()throws@NonEmptyException{}}@SuppressWarnings(unused)publicstaticvoidmain(String[]args){finalHolderStringholder=new@NonEmptyHolderString();@NonEmptyCollection@NonEmptyStringstrings=newArrayList();}}ElementType.TYPE_USE和ElementType.TYPE_PARAMETER是两个新添加的用于描述适当的注解上下文的元素类型。在Java语言中,注解处理API也有小的改动来识别新增的类型注解。参数名字很长一段时间里,Java程序员一直在发明不同的方式使得方法参数的名字能保留在Java字节码中,并且能够在运行时获取它们(比如,Paranamer类库)。最终,在Java8中把这个强烈要求的功能添加到语言层面(通过反射API与Parameter.getName()方法)与字节码文件(通过新版的javac的–parameters选项)中。publicclassParameterNames{publicstaticvoidmain(String[]args)throwsException{Method=ParameterNames.class.getMethod(main,String[].class);for(finalParameter:method.getParameters()){System.out.println(Parameter:+parameter.getName());}}}如果不使用–parameters参数来编译这个类,然后运行这个类,会得到下面的输出:Parameter:arg0如果使用–parameters参数来编译这个类,程序的结构会有所不同(参数的真实名字将会显示出来):Parameter:argsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.1/versionconfigurationcompilerArgument-parameters/compilerArgumentsource1.8/sourcetarget1.8/target/configuration/pluginOptional臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到GoogleGuava的启发,Optional类已经成为Java8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。更多详情请参考官方文档。OptionalStringfullName=Optional.ofNullable(null);System.out.println(FullNameisset?+fullName.isPresent());System.out.println(FullName:+

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功