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

20145211 《Java程序设计》第7周学习总结——沧海横流

2016-04-17 20:47 232 查看

教材学习内容总结

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/1002/215/15学会搭建Java环境,学会写一些简单程序,掌握一些小技巧
第二周100/2002/422/37学会使用IDEA
第三周400/6501/524/61深入了解面向对象
第四周750/14501/630/91理解继承、多态、接口
第五周750/22002/1030/120接触异常处理与Map
第六周400/26002/1230/150感悟输入输出流与线程
第七周600/32001/1316/176掌握日期和时间的运用

参考资料

Java学习笔记(第8版)

《Java学习笔记(第8版)》学习指导

...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: