JDK8新特性ppt课件_第1页
JDK8新特性ppt课件_第2页
JDK8新特性ppt课件_第3页
JDK8新特性ppt课件_第4页
JDK8新特性ppt课件_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JDK8新特性,Oracle甲骨文公司终于在2014年3月发布了Java8正式版,它是java的一个里程牌版本,带来了诸多新特性。官网介绍:十、Scripting,1,java编程语言(JavaProgrammingLanguage),1:lambda表达式:一种新的语言特性,能够把函数作为方法的参数或将代码作为数据。lambda表达式使你在表示函数接口(具有单个方法的接口)的实例更加紧凑。2.方法引用是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,这样使代码更容易阅读3.默认方法:Java8引入defaultmethod,或者叫virtualextensionmethod,目的是为了让接口可以事后添加新方法而无需强迫所有实现该接口的类都提供新方法的实现。也就是说它的主要使用场景可能会涉及代码演进。4.重复注解:允许在同一声明或类型(类,属性,或方法)的使用中多次使用同一个注解5.改善了类型推断6.方法参数反射,2,函数式接口,Java8引入的一个核心概念是函数式接口(FunctionalInterfaces)。接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解FunctionalInterface进行声明。FunctionalInterfacepublicinterfaceRunnablepublicabstractvoidrun();,3,Lambda表达式,函数式接口的重要属性是:我们能够使用Lambda实例化它们,Lambda表达式实例化函数接口作为方法参数,或者将代码作为数据对待。在Java8之前:匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差。在Java8:Lambda表达式的应用则使代码变得更加紧凑,可读性增强;Lambda表达式使并行操作大集合变得很方便,可以充分发挥多核CPU的优势,更易于为多核处理器编写代码;Lambda表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:-;第三部分为方法体,可以是表达式和代码块。语法如下:1.方法体为表达式,该表达式的值作为返回值返回。(parameters)-expression2.方法体为代码块,必须用来包裹起来,且需要一个return返回值,但若函数式接口里面方法返回值是void,则无需返回值。,4,Lambda和匿名内部类,匿名表示法button.addActionListener(newActionListener()OverridepublicvoidactionPerformed(ActionEvente)System.out.print(“这是内部类的表示法!););Lambada表示法button.addActionListener(ActionEvente)-System.out.print(HellloLambdainactionPerformed);,5,Lambda举例,/类型声明MathOperationaddition=(Integera,Integerb)-a+b;/不用类型声明MathOperationsubtraction=(a,b)-a-b;/大括号中的返回语句MathOperationmultiplication=(a,b)-returna*b;/没有大括号及返回语句MathOperationdivision=(Floata,Floatb)-a/b;System.out.println(10+5=+tester.operate(10,5,addition);,6,方法引用,是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现:Listnames=Arrays.asList(zhangsan,lisi,wangwu,zhaoliu);Collections.sort(names,String:compareTo);Functionf1=String:valueOf;Functionfunction=String:new;Suppliersupplier=String:new;,7,默认方法,Java8引入defaultmethod,或者叫virtualextensionmethod,目的是为了让接口可以添加新方法的实现,而无需强迫所有实现该接口的类都提供新方法的实现。比中:publicinterfaceMyInterfacedefaultvoidmyMethod()System.out.println(MyInterface);,8,重复注解,重复注解:允许在同一声明或类型(类,属性,或方法)的使用中多次使用同一个注解Repeatable(Authorities.class)publicinterfaceAuthorityStringrole();publicinterfaceAuthoritiesAuthorityvalue();publicclassRepeatAnnotationUseNewVersionAuthority(role=Admin)Authority(role=Manager)publicvoiddoSomeThing(),9,泛型的推断改进,jdk1.5:Listbox=newArrayList();Jdk1.7:Listbox=newArrayList();Jdk1.8:Listlist=newArrayList();list.addAll(newArrayList();/由于addAll期望获得Collection类型的参数,JDK8可以根据声明的类型自动判断。/lambda表达式的推断MathOperationsubtraction=(a,b)-a-b;,10,Stream介绍,提供了新包java.util.stream,这个包提供了StreamAPI功能,支持以函数风格(functional-style)去处理流中的元素。在CollectionsAPI中已经整合了StreamAPI,可以在集合上进行批量操作(bulkoperations),如顺序或并行的map-reduce转换。StreamAPI提供了一种操作大数据的接口,让数据操作更容易和更快。它具有过滤、映射以及减少遍历数等方法,这些方法分两种:中间方法和终端方法,“流”抽象天生就该是持续的,中间方法永远返回的是Stream,因此如果我们要获取最终结果的话,必须使用终点操作才能收集流产生的最终结果,11,Sream概念,Stream不是集合元素,也不是数据结构,它相当于一个高级版本的Iterator,不可以重复遍历里面的数据,像水一样,流过了就一去不复返。它和普通的Iterator不同的是,它可以并行遍历,普通的Iterator只能是串行,在一个线程中执行。操作包括:中间操作和最终操作(只能操作一遍)串行流操作在一个线程中依次完成。并行流在多个线程中完成,主要利用了JDK7的Fork/Join框架来拆分任务和加速处理。相比串行流,并行流可以很大程度提高程序的效率,12,流的种类,流有串行和并行两种,串行流上的操作是在一个线程中依次完成,而并行流则是在多个线程上同时执行。并行与串行的流可以相互切换:通过stream.sequential()返回串行的流,通过stream.parallel()返回并行的流。相比较串行的流,并行的流可以很大程度上提高程序的执行效率。下面是分别用串行和并行的方式对集合进行排序。list.stream().sequential().sorted().count();,13,流的操作分类:中间,中间操作:Intermediate主要是用来对Stream做出相应转换及限制流,实际上是将源Stream转换为一个新的Stream,以达到需求效果。filter():元素过滤:Stream.of(1,2,3,4,5).filter(item-item3)sorted():元素排序:Stream.of(1,2,3,1,2,3).distinct()map():元素映射:Stream.of(“a”,“b”,“hello”).map(item-item.toUpperCase();flatMap:元素映射:Stream.of(1,2,3).Map(integer-Stream.of(integer*10)distinct():去重操作concat():拼接:Stream.concat(Stream.of(1,2,3),Stream.of(4,5);Peek:peek方法生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数,并且消费函数优先执行skip:跳过。skip方法将过滤掉原Stream中的前N个元素,返回剩下的元素所组成的新StreamIterate:其返回的也是一个无限长度的Stream,通过函数f迭代对给指定的元素种子而产生无限连续有序Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed)无限循环generator方法,返回一个无限长度的Stream,其元素由Supplier接口的提供。,14,流的操作分类:短路,短路操作(Short-circuiting):对流中的元素进行判断、取值等操作。allMatch:判断Stream中的元素是否全部满足指定条件。如果全部满足条件返回true,否则返回false。anyMatch:判断Stream中的是否有满足指定条件的元素。如果最少有一个满足条件返回true,否则返回false。findAny:操作用于获取含有Stream中的某个元素的Optional,如果Stream为空,则返回一个空的Optional。由于此操作的行动是不确定的,其会自由的选择Stream中的任何元素findFirst:findFirst操作用于获取含有Stream中的第一个元素的Optional,如果Stream为空,则返回一个空的Optional。、limit:截取原Stream前指定值N个元素noneMatch:noneMatch方法将判断Stream中的所有元素是否满足指定的条件,如果所有元素都不满足条件,返回true;否则,返回false.,15,流的操作分类:最终操作,最终操作:最终操作只能操作一遍,操作完成后,该流就会关闭了。如再进行操作,便会报错。forEach():遍历每个元素。reduce():把Stream元素组合起来。例如,字符串拼接,数值的sum,min,max,average都是特殊的reduce。collect():返回一个新的集合。min():找到最小值。max():找到最大值。,16,中间操作:过滤、排序,Filter:过滤,侧重于过滤。forEach:循环Streamstreams=Stream.of(helo,world”,hi,sprin);streams.filter(a)-a.startsWith(h).forEach(System.out:print);Sorted:排序:默认按字符排序,也可以自定义排序。如果数字类型:默认按从小到大的顺序。streams.sorted().forEach(System.out:println);,17,中间操作:去重,distinct:过滤,Stream中包含的元素进行去重操作Streamstreams=Stream.of(HELLO,World,world,WorLd,World,heLLo);streams.distinct().forEach(System.out:println);注:区分大小写,18,中间操作:映射,Map映射:侧重于对元素的转换和操作。封装好了,三种变形:mapToDouble,mapToInt,mapToLongstreams.map(String:toLowerCase).forEach(System.out:println);streams.map(a-a.concat(_aa).forEach(System.out:println);flatMap映射:该换转函数的对象是一个Stream,也不会再创建一个新的Stream,而是将原Stream的元素取代为转换的Stream。flatMapToInt,flatMapToLong和flatMapToDouble。,19,短路操作(Short-circuiting),allMatch:判断Stream中的元素是否全部满足指定条件。如果全部满足条件返回true,否则返回false。anyMatch:判断Stream中的是否有满足指定条件的元素。如果最少有一个满足条件返回true,否则返回false。findAny:操作用于获取含有Stream中的某个元素的Optional,如果Stream为空,则返回一个空的Optional。findFirst:操作用于获取含有Stream中的第一个元素的Optional,如果Stream为空,则返回一个空的Optional。Limit:方法将截取原Stream,截取后Stream的最大长度不能超过指定值NnoneMatch:方法将判断Stream中的所有元素是否满足指定的条件,如果所有元素都不满足条件,返回true;否则,返回false.,20,短路操作,allMatch:Stream.of(1,2,3,4).allMatch(integer-integer0);findAny:Stream.of(1,2,3,4).findAny();findFirst:Stream.of(1,2,3,4).findFirst();Limit:Stream.of(1,2,3,4,5).limit(2)noneMatch:Stream.of(1,2,3,4,5).noneMatch(integer-integer10);和相返,21,最终操作,count方法将返回Stream中元素的个数。forEach:遍历Stream中的所元素,避免了使用for循环,让代码更简洁,逻辑更清晰。max方法根据指定的Comparator,返回一个Optional,该Optional中的value值就是Stream中最大的元素。原Stream根据比较器Comparator,进行排序(升序或者是降序),所谓的最大值就是从新进行排序的,Stream.of(1,2,3,4,5).max();Stream.of(1,2,3,4,5).max(o1,o2)-o2-o1);,22,安全性,Java一直缺少BASE64编码API,以至于通常在项目开发中会选用第三方的API实现(commons-codec或sun.misc.BASE64Decoder)。Java8实现了BASE64编解码API,它包含到java.util中。/编码StringasB64=Base64.getEncoder().encodeToString(HelloJDK8.getBytes(utf-8);System.out.println(asB64);/输出为:SGVsbG8gSkRLOA=/解码byteasBytes=Base64.getDecoder().decode(SGVsbG8gSkRLOA=);System.out.println(newString(asBytes,utf-8);/输出为:HelloJDK8,23,IO/NIO的改进,主要包括:改进了java.nio.charset.Charset的实现,使编码和解码的效率得以提升,也精简了jre/lib/charsets.jar包;优化了String(byte,*)构造方法和String.getBytes()方法的性能;还增加了一些新的IO/NIO方法,使用这些方法可以从文件或者输入流中获取流(java.util.stream.Stream),通过对流的操作,可以简化文本行处理、目录遍历和文件查找。新增的API如下:BufferedReader.line():返回文本行的流StreamFile.lines(Path,Charset):返回文本行的流StreamFile.list(Path):遍历当前目录下的文件和目录File.walk(Path,int,FileVisitOption):遍历某一个目录下的所有文件和指定深度的子目录File.find(Path,int,BiPredicate,FileVisitOption.):查找相应的文件Files.list(newFile(“.”).toPath().forEach(System.out:println);操作列出当前目录下的所有文件和目录,24,全球化功能,支持新的Unicode6.2.0标准,新增了日历和本地化的API,改进了日期时间的管理等。Java8吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的java.time中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的Date类新增了toInstant()方法,用于把Date转换成新的表示形式。这些新增的本地化时间日期API大大简化了了日期时间和本地化的管理。,25,时间操作举例,例如,下面是对LocalDate,LocalTime的简单应用:/LocalDateLocalDatelocalDate=LocalDate.now();/获取本地日期localDate=LocalDate.ofYearDay(2014,200);/获得2014年的第200天System.out.println(localDate.toString();/输出:2014-07-19localDate=LocalDate.of(2014,Month.SEPTEMBER,10);/2014年9月10日System.out.println(localDate.toString();/输出:2014-09-10/LocalTimeLocalTimelocalTime=LocalTime.now();/获取当前时间System.out.println(localTi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论