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

下载本文档

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

文档简介

1、JDK8新特性,JDK8新特性,Oracle甲骨文公司终于在2014年3月发布了Java 8正式版,它是 java的一个里程牌版本,带来了诸多新特性。 官网介绍: 一、针对java编程语言(Java Programming Language) 二、针对集合(Collections) 三、Compact Profiles 四、安全性 五、JavaFX 六 工具(tools) 七、国际化 八、部署 九、Date-Time Package 十、Scripting,JDK8新特性,java编程语言(Java Programming Language),1:lambda表达式:一种新的语言特性,能够把函

2、数作为方法的参数或将代码作为数据。lambda表达式使你在表示函数接口(具有单个方法的接口)的实例更加紧凑。 2.方法引用 是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,这样使代码更容易阅读 3.默认方法:Java 8引入default method,或者叫virtual extension method,目的是为了让接口可以事后添加新方法而无需强迫所有实现该接口的类都提供新方法的实现。也就是说它的主要使用场景可能会涉及代码演进。 4.重复注解:允许在同一声明或类型(类,属性,或方法)的使用中多次使用同一个注解 5.改善了类型推断 6.方法参数反射,JD

3、K8新特性,函数式接口,Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。接口定义个唯一一个抽象方法, 那么这个接口就成为函数式接口。同时,引入了一个新的注解:FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接 口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 FunctionalInterface 进行声明。 FunctionalInterface public interface Runnable public abstract void run(); ,JD

4、K8新特性,Lambda表达式,函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式实例化函数接口作为方法参数,或者将代码作为数据对待。 在 Java 8 之前:匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读 性很差。 在 Java 8:Lambda 表达式的应用则使代码变得更加紧凑,可读性增强; Lambda 表达式使并行 操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码; Lambda 表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:-; 第

5、三部分为方法体,可以是表达式和代码块。 语法如下: 1. 方法体为表达式,该表达式的值作为返回值返回。(parameters) - expression2. 方法体为代码块,必须用 来包裹起来,且需要一个 return 返回值,但若函数式接 口里面方法返回值是 void,则无需返回值。,JDK8新特性,Lambda和匿名内部类,匿名表示法 button.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) System.out.print(“这是内部类的表示法!););

6、 Lambada表示法 button.addActionListener( (ActionEvent e)-System.out.print(Helllo Lambda in actionPerformed);,JDK8新特性,Lambda举例,/ 类型声明 MathOperation addition = (Integer a,Integer b) - a + b; / 不用类型声明 MathOperation subtraction = (a, b) - a - b; / 大括号中的返回语句 MathOperation multiplication = (a, b) - return a

7、* b; / 没有大括号及返回语句 MathOperation division = (Float a, Float b) - a / b; System.out.println(10 + 5 = + tester.operate(10, 5, addition);,JDK8新特性,方法引用,是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现: List names = Arrays.asList(zhangsan, lisi, wangwu, zhaoliu); Collections.sort(names, String:compareTo); Funct

8、ion f1 = String:valueOf; Function function = String:new; Supplier supplier = String:new;,JDK8新特性,默认方法,Java 8引入default method,或者叫virtual extension method,目的是为了让接口可以添加新方法的实现,而无需强迫所有实现该接口的类都提供新方法的实现。 比中: public interface MyInterface default void myMethod() System.out.println(MyInterface); ,JDK8新特性,重复注解

9、,重复注解:允许在同一声明或类型(类,属性,或方法)的使用中多次使用同一个注解 Repeatable(Authorities.class) public interface Authority String role(); public interface Authorities Authority value(); public class RepeatAnnotationUseNewVersion Authority(role=Admin) Authority(role=Manager) public void doSomeThing() ,JDK8新特性,泛型的推断改进,jdk1.5:

10、List box = new ArrayList(); Jdk1.7: List box = new ArrayList(); Jdk1.8: List list = new ArrayList(); list.addAll(new ArrayList(); / 由于addAll期望获得Collection类型的参数,JDK8可以根据声明的类型自动判断。 /lambda表达式的推断 MathOperation subtraction = (a, b) - a - b;,JDK8新特性,Stream介绍,提供了新包java.util.stream,这个包提供了Stream API功能,支持以函数

11、风格(functional-style)去处理流中的元素。在Collections API中已经整合了Stream API,可以在集合上进行批量操作(bulk operations),如顺序或并行的map-reduce转换。 Stream API提供了一种操作大数据的接口,让数据操作更容易和更快。它具有过滤、映射以及减少遍历数等方法,这些方法分两种:中间方法和终端方法,“流”抽象天生就该是持续的,中间方法永远返回的是Stream,因此如果我们要获取最终结果的话,必须使用终点操作才能收集流产生的最终结果,JDK8新特性,Sream概念,Stream 不是 集合元素,也不是数据结构,它相当于一个

12、高级版本的 Iterator,不可以重复遍历里面的数据,像水一样,流过了就一去不复返。它和普通的 Iterator 不同的是,它可以并行遍历,普通的 Iterator 只能是串行,在一个线程中执行。 操作包括:中间操作 和 最终操作(只能操作一遍) 串行流操作在一个线程中依次完成。 并行流在多个线程中完成,主要利用了 JDK7 的 Fork/Join 框架来拆分任务和加速处理。相比串行流,并行流可以很大程度提高程序的效率,JDK8新特性,流的种类,流有串行和并行两种,串行流上的操作是在一个线程中依次完成,而并行流则是在多个线程 上同时执行。并行与串行的流可以相互切换:通过 stream.seq

13、uential() 返回串行的流, 通过 stream.parallel() 返回并行的流。相比较串行的流,并行的流可以很大程度上提高 程序的执行效率。 下面是分别用串行和并行的方式对集合进行排序。 list.stream().sequential().sorted().count();,JDK8新特性,流的操作分类:中间,中间操作:Intermediate主要是用来对Stream做出相应转换及限制流,实际上是将源Stream转换为一个新的Stream,以达到需求效果。 filter(): 元素过滤:Stream.of(1, 2, 3, 4, 5).filter(item - item 3)

14、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的所有元素的

15、新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数,并且消费函数优先执行 skip:跳过。skip方法将过滤掉原Stream中的前N个元素,返回剩下的元素所组成的新Stream Iterate: 其返回的也是一个无限长度的Stream,通过函数f迭代对给指定的元素种子而产生无限连续有序Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed)无限循环 generator方法,返回一个无限长度的Stream,其元素由Supplier接口的提供。,JDK8新特性,流的操作分类:短路,短路操作(Short

16、-circuiting):对流中的元素进行判断、取值等操作。 allMatch:判断Stream中的元素是否全部满足指定条件。如果全部满足条件返回true,否则返回false。 anyMatch:判断Stream中的是否有满足指定条件的元素。如果最少有一个满足条件返回true,否则返回false。 findAny:操作用于获取含有Stream中的某个元素的Optional,如果Stream为空,则返回一个空的Optional。由于此操作的行动是不确定的,其会自由的选择Stream中的任何元素 findFirst:findFirst操作用于获取含有Stream中的第一个元素的Optional,如

17、果Stream为空,则返回一个空的Optional。 、limit:截取原Stream前指定值N个元素 noneMatch:noneMatch方法将判断Stream中的所有元素是否满足指定的条件,如果所有元素都不满足条件,返回true;否则,返回false.,JDK8新特性,流的操作分类:最终操作,最终操作:最终操作只能操作一遍,操作完成后,该流就会关闭了。如再进行操作,便会报错。 forEach():遍历每个元素。 reduce():把Stream 元素组合起来。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。 collect():返回一个新的集

18、合。 min():找到最小值。 max():找到最大值。,JDK8新特性,中间操作:过滤、排序,Filter:过滤,侧重于过滤。forEach:循环 Stream streams = Stream.of(helo,world”,hi,sprin); streams.filter(a)-a.startsWith(h).forEach(System.out:print); Sorted:排序:默认按字符排序,也可以自定义排序。 如果数字类型:默认按从小到大的顺序。 streams.sorted().forEach(System.out:println);,JDK8新特性,中间操作:去重,disti

19、nct:过滤,Stream中包含的元素进行去重操作 Stream streams = Stream.of(HELLO,World,world,WorLd,World,heLLo); streams.distinct().forEach(System.out:println); 注:区分大小写,JDK8新特性,中间操作:映射,Map映射:侧重于对元素的转换和操作。封装好了,三种变形:mapToDouble,mapToInt,mapToLong streams.map(String:toLowerCase).forEach(System.out:println); streams.map(a-a.

20、concat(_aa).forEach(System.out:println); flatMap映射:该换转函数的对象是一个Stream,也不会再创建一个新的Stream,而是将原Stream的元素取代为转换的Stream。flatMapToInt,flatMapToLong和flatMapToDouble。,JDK8新特性,短路操作(Short-circuiting),allMatch:判断Stream中的元素是否全部满足指定条件。如果全部满足条件返回true,否则返回false。 anyMatch:判断Stream中的是否有满足指定条件的元素。如果最少有一个满足条件返回true,否则返回f

21、alse。 findAny:操作用于获取含有Stream中的某个元素的Optional,如果Stream为空,则返回一个空的Optional。 findFirst:操作用于获取含有Stream中的第一个元素的Optional,如果Stream为空,则返回一个空的Optional。 Limit:方法将截取原Stream,截取后Stream的最大长度不能超过指定值N noneMatch:方法将判断Stream中的所有元素是否满足指定的条件,如果所有元素都不满足条件,返回true;否则,返回false.,JDK8新特性,短路操作,allMatch:Stream.of(1, 2, 3, 4) .all

22、Match(integer - integer 0); 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 - integer 10); 和相返,JDK8新特性,最终操作,count方法将返回Stream中元素的个数。 forEach:遍历Stream中的所元素,避免了使用for循环,让代码更简

23、洁,逻辑更清晰。 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);,JDK8新特性,安全性,Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用第三方的API实现(commons-codec或sun.misc.BASE64Dec

24、oder)。 Java 8实现了BASE64编解码API,它包含到java.util中。 / 编码 String asB64 = Base64.getEncoder().encodeToString(Hello JDK8.getBytes(utf-8); System.out.println(asB64); / 输出为: SGVsbG8gSkRLOA= / 解码 byte asBytes = Base64.getDecoder().decode(SGVsbG8gSkRLOA=); System.out.println(new String(asBytes, utf-8); / 输出为: Hel

25、lo JDK8,JDK8新特性,IO/NIO的改进,主要包括:改进了 java.nio.charset.Charset 的实 现,使编码和解码的效率得以提升,也精简了 jre/lib/charsets.jar 包;优化了 String(byte,*) 构造方法和 String.getBytes() 方法的性能;还增加了一些新的 IO/NIO 方法,使用这些方法可以从文件或者输入流中获取流(java.util.stream.Stream), 通过对流的操作,可以简化文本行处理、目录遍历和文件查找。 新增的 API 如下: BufferedReader.line(): 返回文本行的流 Stream

26、File.lines(Path, Charset):返回文本行的流 StreamFile.list(Path): 遍历当前目录下的文件和目录File.walk(Path, int, FileVisitOption): 遍历某一个目录下的所有文件和指定深度的子目录File.find(Path, int, BiPredicate, FileVisitOption. ): 查找相应的文件 Files.list(new File(“.”).toPath() .forEach(System.out:println); 操作列出当前目录下的所有文件和目录,JDK8新特性,全球化功能,支持新的 Unicod

27、e 6.2.0 标准,新增了日历和本地化的 API,改进了日期时间的管理等。Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了 所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间 (LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间 日期 API 大大简化了了日期时间和本地化的管理。,JDK8

28、新特性,时间操作举例,例如,下面是对 LocalDate,LocalTime 的简单应用:/LocalDateLocalDate localDate = LocalDate.now(); /获取本地日期localDate = LocalDate.ofYearDay(2014, 200); / 获得 2014 年的第 200 天 System.out.println(localDate.toString();/输出:2014-07-19 localDate = LocalDate.of(2014, Month.SEPTEMBER, 10); /2014 年 9 月 10 日 System.out.println(localDate.toString();/输出:2014-09-10/LocalTimeLocalTime localTime = LocalTime.now(); /获取当前时间 System

温馨提示

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

评论

0/150

提交评论