20155305乔磊2016-2017-2《Java程序设计》第七周学习总结
教材学习内容总结
第十二章 Lambda
12.1 认识Lambda语法
- Lambda 教材的引入循序渐近、深入浅出
- 如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例:
(String name1,String name2)->name1.length() - name2.length();```
- JDK8提供了方法参考的特性,可以重用byLength方法
- 方法参考的特性,在重用现有API上扮演了重要角色,重用现有方法操作,可避免到处写下Lambda表达式
- 方法参考不仅避免了重复撰写Lambda表达式,也可以让程序代码更清楚
- ```Arrays.sort```
- lambda表达式中,即使不接受任何参数,也必须写下括号。例如:
() -> "Justin" //不接受参数,返回字符串
() -> System.out.println() //不接受参数,没有返回值
- 在只有Lambda表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译程序可推断出类型的情况下,就可以不写出Lambda表达式的参数类型。例:
Comparator<String>byLength = (name1,name2) -> name1.length() - name2.length();
//可从Comparator<String>中推断出name1与name2的类型,实际上是String,因而不用写出参数类型
- Lambda表达式本身是中性的,不代表任何类型的实例,同样的Lambda表达式,可用来表示不同目标类型的对象操作
- JDK8的Lambda并没有导入新类型来作为Lambda表达式的类型,而是就现有的interface语法来定义函数接口,作为Lambda表达式的目标类型
- Lambda表达式只关心方法签署上的参数与返回定义,但忽略方法名称
- 有个新标注@FunctionalInterface在JDK8中被引入,它可以这么使用:
@FunctionalInterface
public iterface Func<P,R>{
R apply(P p);
}
- 如果接口使用了@FunctionalInterface来标注,而本身并非函数接口的话,就会引发编译错误
- Lambda遇上this与final
- Lambda表达式中this的参考对象以及toString()的接受者,是来自Lambda的周围环境,也就是看Lambda表达式是在哪个名称范畴,就能参考该范畴内的名称,像是变量或方法
- 在JDK中,如果变量本身等效于final局部变量,也就是说,如果变量不会再匿名类中有重新指定的动作,就可以不用加上final关键词
- 如果Lambda表达式中捕获的局部变量本身等效于final局部变量,可以不用在局部变量上加上fianl
- 在lambda表达式中不可以改变被捕获的局部变量值
**- 方法与构造函数参考**
- Lambda表达式只是定义函数接口操作的一种方式,除此之外,只要静态方法的方法签署中,参数与返回值定义相同,也可以使用静态方法来定义函数接口操作,例:可用第二段代码代替第一段代码:
String[] names = {"Justin","caterpillar","Bush"}'
Arrays.sort(names,(name1,name2) ->name1.length() - name2.length());
##第十三章 时间与日期
###13.1 认识时间与日期
- 时间的度量
- 格林威治标准时间:简称GMT,已不作为标准时间使用
- 世界时:在1972年引入UTC之前,GMT与UT是相同的
- 国际原子时:简称TAI
- 世界协调时间:简称UTC
- Unix时间:不考虑闰秒修正,用以表达时间轴上某一瞬间
- epoch:某个特定时代的开始,用以表达时间轴上某一瞬间
- **几个重点:**
- 就目前来说,即使标注为GMT,实际上谈到时间指的是UTC时间
- 秒的单位定义是基于TAI,也就是铯原子辐射振动次数
- UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒,最近一次的闰秒修正为2012年6月30日,当时TAI实际上已超前UTC有35秒之长
- Unix时间是1970年1月1日00:00:00为起点而经过的秒数,不考虑闰秒,不少来自于Unix的系统、平台、软件等,也都选择这个时间作为时间表示法的起算点
- **年历简介:**
- 儒略历:修正了罗马历隔三年设置一闰年的错误,改采四年一闰
- 格里高利历:改革了儒略历
- ISO 8601标准:并非年历系统,而是时间日期表示方法的标准,用以统一时间日期的数据交换格式
- **时区**
- 每个地区的标准时间各不相同
###13.2 认识Date与Calendar
- 时间轴上瞬间的Date
- ```System.currentTimeMillis()```:如果想要取得系统时间,方法之一是使用```System.currentTimeMillis()```方法,返回的是long类型整数,代表1970年1月1日0时0分0秒0毫秒至今经过的毫秒数
- 有人会使用Date实例来取得系统时间描述,不过Date也是偏向机器的时间观点,例如:
import java.util.*;
import static java.lang.System.*;
public class DateDemo {
public static void main(String[] args) {
Date date1 = new Date(currentTimeMillis());
Date date2 = new Date();
out.println(date1.getTime());
out.println(date2.getTime());
}
}

- Date有两个构造函数可以使用,一个可使用epoch毫秒数构建,另一个为无自变量构造函数,内部亦是使用```System.currentTimeMillis()```取得epoch毫秒数,调用```getTime()```可取得内部保存的epoch毫秒数值
- Date实例基本上建议只用来当作时间轴上的某一瞬间
- 因为Date实例的时区无法变换,也不建议使用```toString()```来得知年月日等字段信息,有关字符串时间格式的处理,不再是Date的职责
- 格式化时间日期的DateFormat
- ```java.text.DateFormat:```字符串时间格式处理
- 取得SimpleDateFormat实例:
- 直接构建SimpleDateFormat实例
- 使用DateFormat的```getDateInstance()```、```getTimeInstance()```、```getDateTimeInstance()```等静态方法
**处理时间日期的Calendar**
- Date现在建议作为时间轴上的瞬时代表
- DateFormat:格式化时间日期
- Calendar:取得某个时间日期信息,或者对时间日期进行操作
- 通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例,例如:
Calendar calendar = Calendar.getInstance();
- 取得Calendar实例后,可以使用getTime()取得Date实例,如果想要取得年月日等日期时间字段,可以使用get()方法指定Calender上的字段枚举常数:
out.println(calendar.get(Calendar.YEAR));
out.println(calendar.get(Calendar.MOUNTH));
out.println(calendar.get(Calendar.DATE));
- 如果你要设定时间日期等字段,不要对Date设定,应该使用out.println(calendar.get(Calendar.YEAR));,同样地,月份的部分请使用枚举常数设定:
Calendar calendar = Calendar.getInstace();
calendar.set(2014,Calendar.MAY,26); //2015/5/26
out.println(calendar.get(Calendar.YEAR)); //2014
out.println(calendar.get(Calendar.MOUNTH)); //Calendar.MAY的值4
out.println(calendar.get(Calendar.DATE)); //26
- 在取得一个Calendar的实例后,可以使用add()方法,来改变Calendar的时间:
calendar.add(Calendar.MONTH,1); //Calendar时间加一个月
calendar.add(Calendar.HOUR,3); //Calendar时间加三小时
calendar.add(Calendar.YEAR,-2); //Calendar时间减两年
calendar.add(Calendar.DATE,3); //Calendar时间加三天
- 如果打算只针对日期中某个字段加减,则可以使用roll()方法:
calendar.roll(Calendar.DATE,1); //只对日字段加1
- 想比较两个Calendar的时间日期先后,可以使用after()或before()方法
- 设定TimeZone
- 使用Calendar时若没有使用时区信息,则会使用默认时区
###13.3 JDK8新时间日期API•
- 机器时间观点的API
- 如果你取得Date实例,下一步该获取时间信息应该是通过Date的getTime()取得epoch毫秒数,这样就不会混淆
- now():取得代表Java epoch毫秒数的Instance实例
- ofEpochMill():指定Java epoch毫秒数
- ofEpochSecond():指定秒数,在取得Instance实例后,可以使用plusScends()、plusMillis()、plusNanos()、minusSeconds()、minusMillis()、minusNanos()来做时间轴上的运算
- toInstance():想要改用Instance,可以调用Date实例的toInstance()方法来取得,如果有个Instance实例,可以使用Date的静态方法from()转为Date
- 人类时间观点的API
- LocalDateTime、LocalDate、LocalTime
- LocalDateTime:包括日期与时间
- LocalDate:只有日期,如果设定不存在的日期,会抛出DateTimeException
- LocalTime:只有时间
- 这些类是不具时区的时间与日期定义
- LocalDateTime.of:由于没有时区信息,程序无从判断这个时间是否不存在,就不会抛出DateTimeException
- ZonedDateTime、OffsetdateTime
```- 如果你的时间日期需要带有时区,可以基于LocalDateTime、LocalDate、LocalTime等来补充缺少的信息:```
import static java.lang.System.out;
import java.time.*;
public class ZonedDateTimeDemo {
public static void main(String[] args) {
LocalTime localTime = LocalTime.of(0, 0, 0);
LocalDate localDate = LocalDate.of(1975, 4, 1);
ZonedDateTime zonedDateTime = ZonedDateTime.of(
localDate, localTime, ZoneId.of("Asia/Taipei"));
out.println(zonedDateTime);
out.println(zonedDateTime.toEpochSecond());
out.println(zonedDateTime.toInstant().toEpochMilli());
}
}
# 教材学习中的问题和解决过程
- 问题
如何计算一个程序的运行时间
- 解决
(1)以毫秒为单位计算:
```long startTime=System.currentTimeMillis(); //获取开始时间```
```doSomeThing(); //测试的代码段```
```long endTime=System.currentTimeMillis(); //获取结束时间```
```System.out.println("程序运行时间: "+(end-start)+"ms");```
(2)以纳秒为单位计算:
```long startTime=System.nanoTime(); //获取开始时间```
```doSomeThing(); //测试的代码段```
```long endTime=System.nanoTime(); //获取结束时间```
```System.out.println("程序运行时间: "+(end-start)+"ns");```
# 代码调试中的问题和解决过程
- 问题
书上435页的代码为什么要调用clone()?
- 解决
避免调用yearsBetween()、datsBetween()之后传入的Calendar自变量被修改,两个方法都对第一个自变量进行了clone()复制对象的动作。执行结果如下:

# [代码托管](https://git.oschina.net/bestiisjava2017/ql20155305/tree/master/src/%E7%AC%AC%E4%B8%83%E5%91%A82/src?dir=1&filepath=src%2F%E7%AC%AC%E4%B8%83%E5%91%A82%2Fsrc&oid=48b78873cfe636c160ed9834b313bd99a948f012&sha=498bbd2087ed8f53a6be03eb6872f1fb3d6c12f1)

# 上周考试错题总结
- 调用线程的interrupt()方法 ,会抛出()异常对象?
- A .IOException
- B .IllegalStateException
- C .RuntimeException
- D .InterruptedException
- E .SecurityException
- 正确答案: D E
- 我的答案: D
- 分析:查看帮助文档
- 下面哪条命令可以把 f1.txt 复制为 f2.txt ?
- A .cp f1.txt f2.txt
- B .copy f1.txt f2.txt
- C .cat f1.txt > f2.tx
- D .cp f1.txt | f2.tx
- E .copy f1.txt | f2.tx
- 正确答案: A C
- 我的答案: C
- 分析:copy是Windows下的命令。cat f1.txt > f2.tx 通过输出重定向实现了复制。
# 结对及互评
### 评分标准
1. 正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
2. 模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- [代码托管](链接)不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
3. 教材学习中的问题和解决过程, 一个问题加1分
4. 代码调试中的问题和解决过程, 一个问题加1分
5. 本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
6. 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
7. 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
### 点评模板:
- 博客中值得学习的或问题:
- XXX
- 代码中值得学习的或问题:
- XXX
- 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
- [参考示例](http://www.cnblogs.com/haoliberale/p/6580822.html#3650972)
### 点评过的同学博客和代码
- 本周结对学习情况
- [20155311]
- 结对照片
- 结对学习内容
- Lambda
- 时间与日期
- 上周博客互评情况
其他5人博客都很好
- 李晓莹[20155318](http://www.cnblogs.com/lxy1997/p/6659444.html)
- 刘子健[20155314](http://www.cnblogs.com/crazymosquito/p/6659808.html)
- 潘滢昊[20155210](http://www.cnblogs.com/panyinghao/p/6659574.html)
- 滕树晨[20155301](http://www.cnblogs.com/fengxingck/p/6659927.html)
- 徐子涵[20155208](http://www.cnblogs.com/xuzihan/p/6660024.html)
## 学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 3000行 | 20篇 | 400小时 | |
| 第一周 | 200/200 | 1/1 | 18/18 | |
| 第二周 | 153/353 | 1/2 | 18/36 | |
| 第三周 | 356/709 | 1/3 | 24/60 | |
| 第四周 | 450/1259 | 1/4 | 28/85 | |
| 第五周 | 479/1738 | 1/5 | 30/115 | |
| 第六周 | 700/2438 | 1/6 | 30/145 | |
| 第七周 | 450/2888 | 2/8 | 31/176 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:[软件工程软件的估计为什么这么难](http://www.cnblogs.com/xinz/archive/2011/04/05/2005978.html),[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294.html)
- 计划学习时间:32小时
- 实际学习时间:31小时
- 改进情况:本周有实验,所以计划提高了学习时间,但是除实验外的代码就编写比上周少了,学习时间有所提高的。
(有空多看看[现代软件工程 课件
软件工程师能力自我评价表](http://www.cnblogs.com/xinz/p/3852177.html))
## 参考资料
- [Java学习笔记(第8版)](http://book.douban.com/subject/26371167/)
- [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
- ...
20155305乔磊2016-2017-2《Java程序设计》第七周学习总结的更多相关文章
- 201521123027 <java程序设计>第七周学习总结
1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...
- 20155305乔磊2016-2017-2《Java程序设计》第二周学习总结
20155305乔磊 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 第三章学习了基本类型 整数(short.int.long) 字节(byte) 浮点数(f ...
- 20155305乔磊2016-2017-2《Java程序设计》第九周学习总结
20155305 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC入门 JDBC简介 1.JDBC是java联机数据库的标准规范,它定义了一组标准类与 ...
- 20155331 2016-2017-2 《Java程序设计》第九周学习总结
20155331 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC是什么? JDBC代表Java数据库连接,这对Java编程语言和广泛的数据库之间独立 ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
随机推荐
- ABAP-动态程序生成
科技越来越进步,人也就变的越来越懒,最终的演变就是大脑发达,四肢退化...AI的到来,准备接招吧... 报表若没有过多的用户交互逻辑,一般可通过SQ01配置生成,本文介绍用ABAP方式实现报表程序的动 ...
- 不定宽高的DIV,垂直水平居中
1.怎么让一个不定宽高的DIV,垂直水平居中? 答:1)使用CSS方法. 父盒子设置: display:table-cell; text-align:center; vertical-align:mi ...
- Java 如何产生UUID
1.UUID 简介 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Found ...
- block元素和inline元素的特点
一.block元素的特点 1.处于常规流中时,如果width没有设置,会自动填充满父容器 2.可以设置height/width及margin/padding 3.处于常规流中时,布局在前后元素位置之间 ...
- The 2018 Nobel prizesThe Nobel prize for economics is awarded for work on the climate and economic growth
The 2018 Nobel prizesThe Nobel prize for economics is awarded for work on the climate and economic g ...
- python 刷题必备
1.判断输入的数字是否是回文数: 学习内容:把数字转成字符串 1. def is_palindrome(n): n=str(n) m=n[::-1] return n==m 2. tmp_str = ...
- conductor任务域
任务域 任务域有助于支持任务开发.这个想法是相同的“任务定义”可以在不同的“域”中实现.域名开发人员控制的任意名称.因此,当工作流程启动时,调用者可以在工作流中的所有任务中指定哪些任务需要在特定域中运 ...
- dubbo dubbo.xsd 报错
构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wil ...
- Oracle to_date()函数的用法《转载》
to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明, 原文地址:http://database.51cto.com/art ...
- 图解Java常用数据结构(一)【转载】
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...