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

20145208 《Java程序设计》第7周学习总结

2016-04-17 13:28 447 查看

20145208 《Java程序设计》第7周学习总结

教材学习内容总结

Lambda

认识Lambda语法

什么是Lambda语法

以下是维基百科上的解释:

a function (or a subroutine) defined, and possibly called,
without being bound to an identifier。


翻译过来就是:一个不用被绑定到一个标识符上,并且可能被调用的函数。更简单的理解就是一段带有输入参数的可执行语句块。

Lambda去可以重复,符合DRY原则,而且Lambda表达式可读性更好,操作更简单。

方法引用(Method Reference)

一条语句用Lambda表达式,多条语句用方法引用

函数接口(Functional Interface)

就是只有一个抽象方法的接口

Runnable

Callable

Comparator

……

可引用的包括类的静态方法、成员方法、构造方法

Functional与Stream API

使用Optional代替null

标准API的函数接口

Consumer:一个参数,无返回值

Function:一个参数,有返回值

Predicate:一个参数,有返回值,返回值必须是boolean类型的

Supplier:无参数,有返回值

Stream与管道

时间与日期

认识时间与日期

时间的度量

GMT(Greenwich Mean Time)时间:现在不是标准时间

世界时(Universal Time,UT):1972年UTC出来之前,UT等价于GMT

国际原子时(TAI):秒的定义

世界协调时间(Corrdinated Universal Time, UTC): 闰秒

Unix时间: 1970.1.1 00:00:00开始的秒数

epoch: java.util.Date epoch毫秒数

认识Date与Calendar

Date与DateFormat

Date只用来获取epoch毫秒数

DateFormat来格式化成人类理解的年月日时分秒

Calendar: 时间的运算

getInstance(): 用来取得Calendar实例

getTime():取得Date实例

get():指定取得实例上的字段枚举常数

add():改变实例的时间

roll():只针对日期中某个字段加减

after():比较两个实例的日期先后

before():同上

...

JDK8新时间日期API

人类时间(ISO8601 标准)

LocalDateTime:包括日期与时间

LocalDate:只有日期

LocalTime:只有时间

ZonedDateTime:时区的日期与时间

OffsetdateTime:代表UTC偏移量

Year:表示年

YearMonth:表示年月

Month:表示月

MonthDay:表示月日

教材学习中的问题和解决过程

问题一

p384 LambdaDemo.java: Lambda

修改代码,实现逆序排序

修改代码如下,只需要将sort中的排序方式改变一下就可以了:

public class LamabdaDemo2 {
public static void main(String[] args) {
String[] names={"Justin","caterpillar","Bush"};
Arrays.sort(names,(name1, name2)->name2.length()-name1.length());
System.out.println(Arrays.toString(names));
}
}


运行结果:



问题二

p393 MethodReferenceDemo.java: 方法引用

如何运行这个程序?运行结果?

原代码运行结果是空白的,如下:



这是因为
asList(args)
里面上面的没有,所以要想有运行结果需要修改
args
,比如我想让它输出我的学号姓名,就可以将代码段改成如下代码:

List<String> names=Arrays.asList("20145208蔡野");
List<Person> persons=map(names,Person::new);
persons.forEach(out::println);


运行结果如下:



当然,我们还可以让它出错多个输出,修改代码段如下:

List<String> names=Arrays.asList("20145208蔡野","20145208caiye");
List<Person> persons=map(names,Person::new);
persons.forEach(out::println);


运行结果如下:



问题三

p398 CustomerDemo.java: 默认方法

加几个一下main中的Customer的对象,让firstName,lastName,zipCode都有相同的和不同的

增加对象只需要在代码段
List<Customer>customers=Arrays.asList();
中添加新的内容就可以了:

List<Customer>customers=Arrays.asList(
new Customer("Justin","Lin",804),
new Customer("Monica","Huang",804),
new Customer("Irene","Lin",804),
new Customer("Justin","Xin",804),
new Customer("Yeeeee","Lin",604),
new Customer("Justin","Zhang",604)
);

问题四

p429 DateDemo.java: Date类测试

System.currentTimeMillis()的结果与这个例子有联系吗?测试一下

测试结果如下:





可以发现测试结果和例子无关,和计算机内的时间有关,输出的结果是递增的。

问题五

p430 DateFormatDemo.java: DateFormat类

发现代码中有什么问题了吗?

我觉得原代码有问题,输出不合理:



图中的时间格式与书上不同,于是我修改了代码顺便加上了内容:

代码段:

static void dateInstanceDemo(Date date){
out.println("getDateInstance() demo");
out.printf("\tLONG: %s%n",getDateInstance(LONG).format(date));
out.printf("\tMEDIUM: %s%n",getDateInstance(MEDIUM).format(date));
out.printf("\tSHORT: %s%n",getDateInstance(SHORT).format(date));
}
static void timeInstanceDemo(Date date){
out.println("getTimeInstance() demo");
out.printf("\tLONG: %s%n",getTimeInstance(LONG).format(date));
out.printf("\tMEDIUM: %s%n",getTimeInstance(MEDIUM).format(date));
out.printf("\tSHORT: %s%n",getTimeInstance(SHORT).format(date));
}
static void dateTimeInstanceDemo(Date date){
out.println("getDateInstance() demo");
out.printf("\tLONG: %s%n",getDateTimeInstance(LONG,LONG).format(date));
out.printf("\tMEDIUM: %s%n",getDateTimeInstance(MEDIUM,MEDIUM).format(date));
out.printf("\tSHORT: %s%n",getDateTimeInstance(SHORT,SHORT).format(date));
}


输出结果如下:



问题六

p436 TimeZoneDemo.java TimeZoneDemo2.java: TimeZone的测试

修改代码获取和设置大陆的时区信息

修改代码段
TimeZone beijingTz=TimeZone.getTimeZone();
来修改时区,修改的时候发现输入
("Asia/Beijing")
的时候居然不能识别:



这是资本主义的恶意么………囧…………

我试着修改成中国第二大诚实上海……居然显示的中国标准时间:



这是……怎么了……好尴尬哦 看来歪果仁更喜欢上海??

代码调试中的问题和解决过程

问题一

p442 HowOld2.java:

如何计算一个程序的运行时间:

一开始我尝试着用
Period
的方法来计算,但是运行结果不对:



通过API我了解到Period方法最小值是天,我要计算的是很小的单位,于是我想到了之前学的DateDemo的方法,于是我用了如下方法:

Date begin = new Date();
...Java Code...
Date end = new Date();
long duration = end.getTime() - begin.getTime();


运行结果:



其他(感悟、思考等)

本周的学习内容让我了解到了Lambda语法,还有时间和日期的应用,在学习的过程中,我发很大代码已经可以在敲出来之前看懂,很多代码中的问题通过API都能够解决,对于java的学习也越来越渐入佳境,每次实验的时候也觉得很有乐趣,经过几次自己设计代码之后觉得设计代码也是一件很有趣的事情,而且,测试别人的代码远远没有测试自己的代码有乐趣。

希望在未来半个学期的学习中,我可以把 java学的越来越好,学好java掌握的不仅仅是一种计算机编程语言,也是种思维上的开拓。

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时成为超过高级初学者的存在
第一周150/1501/315/15第一个JAVA程序
第二周150/3002/520/35第一次对教材代码进行自己的修改
第三周400/7002/720/50熟练的进行代码托管
第四周1210/19102/930/80在敲代码的时候有自己思考
第五周1083/29931/1040/120学习API
第六周1061/40542/1250/170了解到了输入输出与线程
第七周579/46332/1440/210学会了测试代码

参考资料

Java学习笔记(第8版)

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

我的代码托管



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