Java程序设计(第3版) 课件 -第六部分 JDK8及以后版本特性总结_第1页
Java程序设计(第3版) 课件 -第六部分 JDK8及以后版本特性总结_第2页
Java程序设计(第3版) 课件 -第六部分 JDK8及以后版本特性总结_第3页
Java程序设计(第3版) 课件 -第六部分 JDK8及以后版本特性总结_第4页
Java程序设计(第3版) 课件 -第六部分 JDK8及以后版本特性总结_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

第六部分JDK8及以后版本特性总结第26章Lambda表达式Lambda表达式的基本语法Lambda表达式可以理解为传递匿名函数的一种方式,它没有名称,但是有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。Lambda表达式解决了使用匿名方法的麻烦,并且给予Java简洁而强大的函数化编程能力。以下是Lambda表达式的重要特征。 可选的类型声明:参数类型可省略,编译器可以统一识别参数值。 可选的参数圆括号:有一个参数时可省略圆括号,但有多个参数时需要定义圆括号。 可选的主体花括号:主体只包含一个语句时可省略花括号。 可选的返回关键字:只有一行代码时可以省略return语句。函数式接口函数式接口可以被隐式转换为Lambda表达式,函数式接口有如下几个特征: 接口中只能有一个接口方法,可以有多个非抽象方法; 可以有静态方法和默认方法; 可以使用@FunctionalInterface标记; 默认方法可以被覆写。第26章Lambda表达式变量作用域Lambda表达式可以没有限制地捕获实例变量和静态变量,但只能引用标记了final的外层局部变量,即不能在Lambda表达式内部修改定义在域外的局部变量,否则会出现编译错误。因为Lambda表达式可能在另一个线程中运行,而局部变量是在栈上的,Lambda表达式作为额外的线程会生成一份变量副本。这样可能会出现同步问题,因为主线程的局部变量或许已经被回收。实例变量存储于堆中,堆是共享的,静态变量也是共享的。方法引用方法引用可以使开发者直接引用构造方法、静态方法、实例方法或实例对象。方法引用和Lambda表达式配合使用,可以让代码看起来更加简洁,没有很多复杂的模板代码。第26章Lambda表达式Stream概述Stream是一个来自数据源的元素队列,支持聚合操作,允许以声明的方式处理数据集合。StreamAPI把真正的函数式编程风格引入Java中。Stream将要处理的元素集合看成一种流,元素是特定类型的对象,形成一个队列。在处理流的过程中,借助StreamAPI对Stream中的元素进行操作,如筛选、排序、聚合等。Stream包含数据源和聚合操作两个部分。(1)数据源:流的来源,可以是集合、数组、I/Ochannel、产生器(generator)等。(2)聚合操作:类似SQL语句的操作,如filter、map、reduce、find、match、sorted等。对Stream的操作分为两种。(1)中间操作:每次返回一个新的流,可以有多个。(2)终端操作:每个流只能进行一次终端操作,终端操作可视为关闭流的操作,操作结束后流无法再次使用。终端操作会产生一个新的集合或值。Stream的特性如下。(1)集合侧重的是数据,流侧重的则是计算。Stream不存储数据,而是按需计算,按照特定的规则对数据进行计算,一般会输出结果。(2)Stream不会改变数据源,会返回一个持有结果的新Stream。(3)Stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。(4)以前对集合进行遍历都是通过迭代器Iterator或for循环的方式,显式地在集合外部进行迭代,称为外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。流的使用可以总结为如下内容。(1)一个数据源(集合等)执行一个查询。(2)一个中间操作链形成一条流的流水线。(3)一个终端操作执行流水线,并生成结果。第27章Stream创建StreamStream可以通过集合、数组等来创建。通过集合创建流2.通过数组创建流3.通过Stream静态方法of()、iterate()、generate()创建流Stream的中间操作多个中间操作可以连接起来形成一个流水线,中间操作不会执行任何的处理,直到流水线上触发终端操作,并且在终端操作时一次性全部处理,因此该过程称为“惰性求值”。常用的StreamAPI如下。1.筛选与切片2.映射3.排序Stream的终端操作终端操作会从流的流水线中生成结果,该结果可以是任何不是流的值,如List、Integer、void等。一个常见的数据处理方式就是查看数据集中的某些元素是否匹配一个给定的属性。StreamAPI通过一系列方法提供了便利的实现途径。1.查找与匹配2.归约3.收集第27章Stream串行流与并行流串行流:stream,由主线程按顺序对流执行操作。并行流:parallelStream,将一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。前提是流中的数据处理没有顺序要求。第27章StreamOptional类入门Optional类是一个可以为null的容器对象,它可以保存类型为T的值,或者仅仅保存null。Optional提供很多有用的方法,这样就不用显式进行空值检测。如果值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。Optional类的引入很好地解决了空指针异常问题。第28章Optional类创建Optional对象第28章Optional类获取Optional中的值获取Optional中的值的方法有以下两种。使用map从Optional对象中提取和转换值从对象中提取信息是一种常见的模式。在没有使用Optional时,需要先检查对象是否为null,再调用获取方法。否则会报空指针异常。2.使用flatMap链接Optional对象如果需要获取多级嵌套对象中最里层对象的属性,如获取班级中某个学生的学科成绩,在没有使用Optional时,需要多个if语句检查对象是否为空。第28章Optional类更新的日期和时间API概述Java曾三次引入处理时间的API,JDK1.0版本对日期和时间的支持只能依赖java.util.Date类,这个类如类名所表达的,无法表示日期,只能以毫秒的精度表示时间,且其易用性很差。Date类的大多数方法在Java1.1版本引入java.util.Calendar类之后被弃用。但是Calendar类也有类似的问题和设计缺陷。它的实例都是可变的,而且它的API很难使用,甚至月份从0开始;同时存在Date和Calendar两个类,容易造成混乱。Java8引入了java.timeAPI之后纠正了之前的问题,且已经完全实现了JSR-310规范。第29章日期和时间API包描

述java.time包更新的Java日期和时间API的基础包,所有的基础类都是这个包的一部分,如LocalDate、LocalTime、LocalDateTime、Instant、Period、Duration等。所有这些类都是不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求java.time.chrono包为非ISO的日历系统定义了一些泛化的API,可以通过扩展AbstractChronology类来创建自己的日历系统java.time.format包包含能够格式化与解析日期和时间对象的类,绝大多数情况下,不应该直接使用它们,因为java.time包中相应的类已经提供了格式化与解析的方法java.time.temporal包包含一些时态对象,可以用其找出关于日期和时间对象的某个特定日期或时间,比如,可以找到某月的第一天或最后一天。命名格式为“withXxx”,因此可以非常容易地认出这些方法java.time.zone包包含支持不同时区及相关规则的类本地化日期和时间APIjava.time包中提供了LocalDate、LocalTime、LocalDateTime、Instant、Duration和Period类来支持创建简单的日期和时间间隔。LocalDate、LocalTime和LocalDateTime类可以处理时区不必需的情况。1.LocalDate开始使用更新的日期和时间API时,最先碰到的可能是LocalDate类。LocalDate类是一个不可变的类,该类的实例是一个不可变的对象,它只提供了简单的日期,并不含当天的时间信息,也不附带任何与时区相关的信息。它表示默认格式(yyyy-MM-dd)的日期。2.LocalTime同样,一天中的时间,如12:20:42,也可以用LocalTime类表示。LocalTime是一个不可变的类,它的实例代表一个常规可读格式的时间,默认格式为hh:mm:ss.zzz。与LocalDate类一样,该类也提供了时区支持,也可以传入小时、分钟和秒等输入参数创建实例。3.LocalDateTimeLocalDateTime是一个不可变的日期和时间对象,它表示一组日期和时间,即LocalDate和LocalTime的合体,但不带有时区信息。默认格式是yyyy-MM-dd-HH-mm-ss.zzz。可以直接创建对象,也可以通过合并日期和时间对象构造。4.Instant人们习惯的星期几、几号、几点、几分的描述方式,对计算机来说并不容易理解。从计算机的角度来看,建模时间较自然的格式是表示一个持续时间段上某个点的单一大整数。这也是更新的java.time.Instant类对时间建模的方式,即Instant类是用在机器可读的时间格式上的,它以UNIX时间戳的形式存储日期和时间,基本上以UNIX元年时间(UTC时区1970年1月1日零点)开始所经历的秒数进行计算。所以通常说的时间戳指的是秒数,而不是毫秒数,这一点容易搞错,一定要特别注意。5.DurationDuration类主要用于以秒和纳秒衡量时间的长短,通过Duration可以获取两个Temporal对象之间的持续时间。Duration类提供了between静态方法,可以创建两个LocalTime对象、两个LocalDateTime或两个Instant对象的持续时间。但是不能在LocalDateTime和Instant两类对象之间创建duration,否则会抛出DateTimeException异常。6.PeriodDuration类主要用于以秒和纳秒衡量时间的长短,因此不能仅向between方法传递一个LocalDate对象参数。如果需要以年、月、日的方式对多个时间单位建模,可以使用Period类。类中提供静态工厂方法between,可以得到两个LocalDate之间的时长。第29章日期和时间API使用时区的日期和时间API1.处理不同时区和日历系统如果需要考虑到时区,就可以使用时区的日期和时间API,时区的处理是Java8及以后版本日期和时间API增加的重要功能。java.time.ZoneId类是java.util.TimeZone类的替代品,它提供了获取所有时区和本地时区的方法,设计目标是让开发者无须为时区处理而操心,简化对时区的处理。与其他日期和时间类一样,ZoneId也是无法修改的。可以使用静态方法systemDefault()获取当前默认的ZoneId。2.利用和UTC/GMT时间的固定偏差计算时区有时候,会通过诸如“东京比北京早1小时”“纽约晚于伦敦5小时”等表达方式来描述时间。利用当前时区和UTC/GMT时间的固定偏差描述时间,也是表达时区的一种常用方式。此时,可以使用ZoneOffset类,它是ZoneId的一个子类,表示的是当前时间和格林尼治标准时的差异。3.使用别的日历系统Java8及以后版本的日期和时间API还提供了对非ISO日历系统(non-ISOcalendaring)的支持。API提供了几种其他的日历系统,这些日历系统中的每个都有一个对应的日志类。

ThaiBuddhistDate:泰国日历。

Ja

温馨提示

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

评论

0/150

提交评论