20145211 《Java程序设计》第7周学习总结——沧海横流
教材学习内容总结
Lambda
-
Arrays的
sort()
方法可以用来排序,在使用sort()时,需要操作java.util.Comparator
来进行说明,这样一来,语法就显得有些冗长。在JDK8中,可以使用Lambda语法改变Arrays.sort()的可读性: -
Comparator<String> byLength = (String name1,String name2)->name1.length() - name2.length();
编译器可以从byLength变量的声明类型,推断name1与name2的类型,因此可以再简化为: -
Comparator<String> byLength = (name1,name2)->name1.length() - name2.length();
方法参考的特性,在重用现有API上扮演了重要角色。重用现有方法实作,可避免到处写下Lambda运算式,方法参考不仅避免了重复撰写Lambda表达式,也可以让程序代码更清楚. -
Lambda表达式与函数接口:等号右边是Lambda表示式(Expression),等号左边是作为Lambda表示式的目标型态(Target type)
-
Comparator<String> byLength = (String name1,String name2)->name1.length() - name2.length();
如果有目标型态的话,在编译器可推断出类型的情况下,就可以不写出Lambda表示式的参数型态,例如:Comparator<String> byLength = (name1,name2)->name1.length() - name2.length();
Lambda表示式本身是中性的,不代表任何型态的实例,同样的Lambda表示式,可用来表示不同目标型态的对象操作 -
JDK8的Lambda并没有导入新类型来作为Lambda表达式的类型,而是就现有的interface语法来定义函数接口,作为Lambda表达式的目标类型。Lambda表达式只关心方法签署上的参数与返回定义,但忽略方法名称,有个新标注
@FunctionalInterface
在JDK8中被引入.如果接口使用了@FunctionalInterface
来标注,而本身并非函数接口的话,就会引发编译错误。 -
Lambda遇上this与final:Lambda表示式并不是匿名类别的语法蜜糖,如果Lambda表示式中捕获的局部变量本身等效于final局部变量,可以不用在局部变量上加上final,JDK8特意禁止在Lambda中修改局部变量的值。
-
方法与构造函数参考:方法参考(Method references)可以避免你到处写下Lambda表示式,尽量运用现有的API实作,也可以改善可读性。
-
接口默认方法:在JDK8中,interface定义时可以加入默认操作,或者称为默认方法(Default methods),forEach()方法本身已有操作,所以不会破坏Iterable现有的其他操作。在默认方法中不能使用数据成员,因为接口本身不能定义数据成员,也就是默认方法中不能用直接变更状态的流程。
时间与日期
在写Java程序的时候总免不了与日期和时间打交道,特别是在做项目的时候,要按照各种各样的需求显示不同格式的日期和时间,一种方法是DATE另一种是CALENDAR.
SimpleDateFormat 24小时制时间显示
G Era 标志符 Text AD
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
- Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
例:Calendar cal = Calendar.getInstance();
使用默认时区和语言环境获得一个日历。
cal.add(Calendar.DAY_OF_MONTH, -1);
取当前日期的前一天.
cal.add(Calendar.DAY_OF_MONTH, +1);
取当前日期的后一天. - 通过格式化输出日期
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
System.out.println("Today is:"+format.format(Calendar.getInstance().getTime()));
System.out.println("yesterday is:"+format.format(cal.getTime()));
package net.singlex.javadate;
/**
* 以下是利用Calendar类来实现日期时间的,和Date类相比较比较简单
*/
import java.util.*;
public class Testdate{
public static void main(String[] args) {
Calendar ca = Calendar.getInstance();
int year = ca.get(Calendar.YEAR);// 获取年份
int month = ca.get(Calendar.MONTH);// 获取月份
int day = ca.get(Calendar.DATE);// 获取日
int minute = ca.get(Calendar.MINUTE);// 分
int hour = ca.get(Calendar.HOUR);// 小时
int second = ca.get(Calendar.SECOND);// 秒
int WeekOfYear = ca.get(Calendar.DAY_OF_WEEK);
System.out.println("用Calendar.getInstance().getTime()方式显示时间: " + ca.getTime());
System.out.println("用Calendar获得日期是:" + year + "年" + month + "月" + day + "日");
System.out.println("用Calendar获得时间是:" + hour + "时" + minute + "分" + second + "秒");
System.out.println(WeekOfYear);// 显示今天是本周的第几天(从周末开始计数,我运行时是周一,故结果为2)
}
}
JDK8新时间日期API
- 机器时间观点的API:
Date名称看来像是人类的时间概念,实际却是机器的时间概念,混淆机器与人类时间观点会引发的问题之一像是日光节约时间。 - 不该使用Date实例的toString()来得知人类观点的时间信息,Date实例应该只代表机器观点的时间资讯,真正可靠的资讯只有内含的epoch毫秒数。
- 人类时间观点的API:
对于片段的日期时间,JDK8新时间与日期API有LocalDateTime()、LocalDate()、LocalTime()等类来定义,这些类基于ISO 8601年历系统,是不具时区的时间与日期定义。
在新的时间与日期API中,UTC偏移量与时区的概念是分开的,offsetDateTime单纯代表UTC偏移量,使用ISO 8601。如果只想表示2014年,可以使用Year,如果想表示2014/5,可以使用YearMonth,如果只想表示5月,可以使用Month,如果想表示5/4,可以使用MonthDay,其中Month是enum型,如果你想要取得代表月份的数字,不要使用oridinal()方法,因为oridinal()是enum在定义时的顺序,从0开始,想要取得代表月份的数要通过getValue()方法。 - 对时间的运算:period与Duration乍看有些难区别,period是日期差,between()方法只接受LocalDate,不表示比“日”更小的单位。然而Duration是时间差,between()方法可以接受LocalDateTime()、LocalDate()、LocalTime(),不表示比“天”更大的单位。
教材学习中的问题和解决过程
import java.util.*;
import java.text.*;
public class Testdate2 {
public static void main(String[] args) {
Date now = new Date();
Calendar cal = Calendar.getInstance();
DateFormat d1 = DateFormat.getDateInstance(); // 默认语言(汉语)下的默认风格(MEDIUM风格,比如:2013-6-10 13:14:41)
String str1 = d1.format(now);
DateFormat d2 = DateFormat.getDateTimeInstance();
String str2 = d2.format(now);
DateFormat d3 = DateFormat.getTimeInstance();
String str3 = d3.format(now);
DateFormat d4 = DateFormat.getInstance(); // 使用SHORT风格显示日期和时间
String str4 = d4.format(now);
DateFormat d5 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); // 显示日期,周,时间(精确到秒)
String str5 = d5.format(now);
DateFormat d6 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); // 显示日期。时间(精确到秒)
String str6 = d6.format(now);
DateFormat d7 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); // 显示日期,时间(精确到分)
String str7 = d7.format(now);
DateFormat d8 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); // 显示日期,时间(精确到分)
String str8 = d8.format(now);// 与SHORT风格相比,这种方式最好用
System.out.println("用Date方式显示时间: " + now);// 此方法显示的结果和Calendar.getInstance().getTime()一样
System.out.println("用DateFormat.getDateInstance()格式化时间后为:" + str1);
System.out.println("用DateFormat.getDateTimeInstance()格式化时间后为:" + str2);
System.out.println("用DateFormat.getTimeInstance()格式化时间后为:" + str3);
System.out.println("用DateFormat.getInstance()格式化时间后为:" + str4);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL)格式化时间后为:" + str5);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG)格式化时间后为:" + str6);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT)格式化时间后为:" + str7);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM)格式化时间后为:" + str8);
}
}
其他(感悟、思考等,可选)
这一周,感觉有点紧凑,虽然这周java学习任务比以往少了点吧,却感觉又多了点。这一周,开始重新练剑了,
有点忙,但还算是自己喜欢做的事。不多说,沧海横流,方显英雄本色;青山矗立,不堕凌云之志 。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 100/100 | 2/2 | 15/15 | 学会搭建Java环境,学会写一些简单程序,掌握一些小技巧 |
第二周 | 100/200 | 2/4 | 22/37 | 学会使用IDEA |
第三周 | 400/650 | 1/5 | 24/61 | 深入了解面向对象 |
第四周 | 750/1450 | 1/6 | 30/91 | 理解继承、多态、接口 |
第五周 | 750/2200 | 2/10 | 30/120 | 接触异常处理与Map |
第六周 | 400/2600 | 2/12 | 30/150 | 感悟输入输出流与线程 |
第七周 | 600/3200 | 1/13 | 16/176 | 掌握日期和时间的运用 |