您的位置:首页 > 编程语言 > Java开发

20145240《Java程序设计》第七周学习总结

2016-04-17 00:10 239 查看

20145240《Java程序设计》第七周学习总结

教材学习内容总结

12.1认识Lambda语法

12.1.1Lambda语法概览

java
中引入了
Lambda的
同时,与现有
API
维持兼容性是主要考虑之一。

方法参考的特性,在重用现有
API
上扮演了重要角色。

重用现有方法操作,可避免到处写下Lambda表达式。

方法参考不仅避免了重复撰写
Lambda
表达式,也可以让程序代码更清楚。

12.1.2Lambda表达式与函数接口

在只有
Lambda
表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译程序可推断出类型的情况下,就可以不写出Lambda表达式的参数类型。

Lambda
表达式本身是中性的,不代表任何类型的实例,同样的
Lambda
表达式,可用来表示不同目标类型的对象操作。

JDK8的Lambda并没有导入新类型来作为Lambda表达式的类型,而是就现有的
interface
语法来定义函数接口,作为
Lambda
表达式的目标类型。

如果接口使用了
@FunctionalInterface
来标注,而本身并非函数接口的话,就会引发编译错误。

12.1.3Lambda遇上this与final

Lambda
表达式并不是匿名类的语法蜜糖。

Lambda
表达式中
this
的参考对象以及
toString()
的接受者,是来自
Lambda
的周围环境,也就是看
Lambda
表达式是在哪个名称范畴,就能参考该范畴内的名称,像是变量或方法。

在JDK中,如果变量本身等效于
final
局部变量,也就是说,如果变量不会再匿名类中有重新指定的动作,就可以不用加上
final
关键词。

如果Lambda表达式中捕获的局部变量本身等效于
final
局部变量,可以不用在局部变量上加上
final


lambda
表达式中不可以改变被捕获的局部变量值。

12.1.4方法与构造函数参考

Lambda
表达式只是定义函数接口操作的一种方式,除此之外,只要静态方法的方法签署中,参数与返回值定义相同,也可以使用静态方法来定义函数接口操作。

12.1.5接口默认方法

除了参考静态方法作为函数接口操作之外,还可以参考特定对象的实例方法。

函数接口操作也可以参考类上定义的非静态方法,函数接口会试图用第一个参数方法接受者,而之后的参数依次作为被参考的非静态方法的参数。

13.1认识时间与日期

13.1.1时间的度量

1.格林威治标准时间(GMT):常被不严谨地当成是
UTC
时间,现已不作为标准时间使用。

2.世界时(UT):在1972年引入
UTC
之前,
GMT
UT
是相同的

3.国际原子时(TAI):秒的单位定义是基于
TAI
,也就是铯原子辐射振动次数。

4.世界协调时间(UTC):
UTC
考虑了地球自转越来越慢而有闰秒修正,确保
UTC
UT
相差不会超过0.9秒。

5.Unix时间:不考虑闰秒修正,用以表达时间轴上某一瞬间

6.epoch:某个特定时代的开始,用以表达时间轴上某一瞬间

13.1.2年历简介

1.儒略历:修正了罗马历隔三年设置一闰年的错误,改采四年一闰。

2.格里高利历:将儒略历1582年10月4号星期四的隔天,订为格里高利历1582年10月15日星期五。

3.ISO 8601标准,采用统一的数据格式例如:
yyyy-mm-ddTHHH:MM:SS.SSS


13.1.3认识时区

每个地区的标准时间各不相同,涉及到地理、法律、经济、社会、政治等问题。

考虑了
UTC
偏移的时间表示上,通常会标识
Z
符号。

有些高纬度国家,夏季、冬季日照时间差异很大,实施日光节约时间。

13.2认识Date与Calendar

13.2.1时间轴上瞬间的Date

eg:使用Date实例来取得系统时间描述。

运行结果



13.2.2格式化时间日期的DateFormate

DateFormat
是个抽象类,其操作类是
java.text.SimpleDateFormat
,你可以直接构建
SimpleDateFormat
实例,或是使用
DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance
等静态方法,用较简便方式按不同需求取得
SimpleDateFormat
实例。

eg:如何通过DateFormat的各种静态方法进行格式化。

运行结果



eg:直接构建SimpleDateFormat的好处是,可使用模式字符串自定义格式。

运行结果



eg:SimpleDateFormat有一个parse()方法,可以按构建SimpleDateFormat时指定的格式,将指定的字符串剖析为Date实例,

运行结果



13.2.3处理时间日期的Calendar

Date现在建议作为时间轴上的瞬间代表,要格式化时间日期则通过
DateFormat
,如果想要取得某个时间日期信息,或者是对时间日期进行操作,可以使用
Calendar
实例。

Calendar
是个抽象类,
java.util.GregorianCalendar
是其子类,操作了儒略历与格里高利历的混合历,通过
Calendar的getInstance()
取得的
Calendar
实例,默认就是取得
GregorianCalendar
实例。

eg:

Calendar calendar = Calendar.getInstance();


取得
Calendar
实例后,可以使用
getTime()
取得
Data
实例,如果想要取得年月日等日期数字时段,可以使用
get()
方法并指定
Calendar
上的数字段枚举常数。

eg:想取得年、月、日字段。

out.println(calendar.get(Calendar.YEAR));
out.println(calendar.get(Calendar.MONTH));
out.println(calendar.get(Calendar.DATE));


如果你要设定时间日期等字段,不要对Date设定,应该使用
Calendar
,同样地,月份的部分请使用枚举常数设定。

eg:

Calendar calendar = Calendar.getInstace();
calendar.set(2016,Calendar.APRIL,16);   // 2016/04/16
out.println(calendar.get(Calendar.YEAR));   // 2016
out.println(calendar.get(Calendar.MOUNTH)); //Calendar.APRIL取值3
out.println(calendar.get(Calendar.DATE));   //16


在取得一个
Calendar
的实例后,可以使用
add()
方法,来改变Calendar的时间。

eg:

calendar.add(Calendar.MONTH,1);  //Calendar时间加1个月
calendar.add(Calendar.HOUR,3);   //Calendar时间加3小时
calendar.add(Calendar.YEAR,-2);  //Calendar时间减2年
calendar.add(Calendar.DATE,3);   //Calendar时间加3天


如果打算只针对日期中某个字段加减,则可以使用
roll()
方法。

eg:

calendar.roll(Calendar.DATE,1);  //只对日字段加1


想比较两个
Calendar
的时间日期先后,可以使用
after()
before()
方法。

eg:使用Calendar计算用户的岁数。

运行结果



13.2.4设定TimeZone

使用
Calendar
时若没有使用时区信息,则会使用默认时区。

eg:可以使用java.util.TimeZone的getDefault()来取得默认时区信息。

运行结果



Calendar在调用
getInstance()
时,可以指定
Timezone
,如果已经取得
Calendar
实例,也可以通过
setTimeZone()
方法设定
TimeZone


eg:想知道现在哥本哈根的时间,并指定TimeZone为北京。

运行结果



13.3JDK8新时间日期API

13.3.1机器时间观点的API

由于台湾时区已经不实施日光节约一段时间了,许多开发者并不知道过去有过日光节约时间,在取得Date实例后,被名称Date误导他们代表日期,所以不应该使用Data实例来得知人类观点的时间信息,
Date
实例只代表机器观点的时间信息,真正可靠的信息只有内含
epoch
毫秒数。

同时也可以使用
Instant
的静态方法
now()
取得代表
Java epoch
毫秒数的
Instant
实例。

在新旧API兼容上,如果取得了
Date
实例,而想要改用
Instant
,则可以调用
Date
实例的
toInstant()
方法来取得,如果你有个
Instant
实例,可以使用
Instant
的静态方法
from()
转为
Date


13.3.2人类时间观点的API

1.LocalDateTime、LocalDate和LocalTime
LocalDateTime:包括日期与时间

LocalDate:只有日期,如果设定不存在的日期,会抛出DateTimeException

LocalTime:只有时间

这些类基于ISO 8601年历系统,是不具时区的时间与日期定义。

对于LocalDateTime.of,由于没有时区信息,程序无从判断这个时间是否不存在,就不会抛出DateTimeException

2.ZonedDateTime、OffsetdateTime
eg:如果你的时间日期需要带有时区,可以基于LocalDateTime、LocalDate、LocalTime等来补充缺少的信息。

运行结果



3.Year、YearMonth、Month、MonthDay
eg:如果想要取得代表月份的数字,不要使用oridinal()方法,因为oridinal()是enum在定义时的顺序,从0开始,想要取得代表月份的数要通过getValue()方法(调整了格式,使其对齐)。

运行结果



13.3.3对时间的运算

1.TemporalAmount

ofPattern()
java.time.format.DateTimeFormatter
的静态方法,可以查看
API
文件了解格式化的方式。

对于时间计量,新时间与日期API以类
Duration
来定义,可用于计量天、时、分、秒的时间差,精度调整可以达纳秒等级,而秒的最大值可以是
long
类型可保存值。

对于年、月、星期、日的日期差,使用
Period
类定义。

plus()
方法可以接受
Duration
实例来计算

eg:使用新时间与日期API改写HowOld范例。

运行结果



2.TemporalUnit

plus()
方法另一重载版本,接受
java.time.temporal.TemporalUnit
实例,
java.time.temporal.ChronoUnit
TemporalUnit
实作类,使用
enum
实作。

TemporalUnit
定义了
between()
等方法。

3.Temporal

相对于
plus()
,也有两个重载两个重载版本的
minus()


plus(TemporalAmount amount)

plus(long amountToAdd,TemporalUnit unit)

minus(TemporalAmount amount)

minus(long amountToSubtract,TemporalUnit unit)

4.TemporalAccessor

TemporalAccessor
定义了只读的时间对象读取操作,实际上
Temporal
TemporalAccessor
子接口,增加了对时间的处理操作,像是
plus()、minus()、with()
等方法。

13.3.4年历系统设计

java.time
套件中的类在需要实行年历系统时都是采用单一的
ISO8601
年历系统。如需要其他年历系统,则需要明确实行
java.time.chrono
中等操作了
java.time.chrono.Chronology
接口的类。

本周代码托管截图





学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周200/2002/220/20
第二周300/5001/330/50
第三周500/10001/435/85
第四周1225/22251/540/125
第五周993/32181/635/160
第六周1360/45782/740/200
第七周228/48062/940/240

参考资料

Java学习笔记(第8版)

《Java学习笔记(第8版)》学习指导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: