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());
}
}
![](http://images2015.cnblogs.com/blog/1071527/201704/1071527-20170407213343503-1364660620.png)
- 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()复制对象的动作。执行结果如下:
![](http://images2015.cnblogs.com/blog/1071527/201704/1071527-20170408231051097-710796104.png)
# [代码托管](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)
![](http://images2015.cnblogs.com/blog/1071527/201704/1071527-20170409190504363-335795673.png)
# 上周考试错题总结
- 调用线程的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可以 ...
随机推荐
- windows7安装svn客户端
全部选择默认的即可, 上面的这种检出方式会报错,要使用下面这种检出方式
- EL表达式获取请求
1EL 表达式语法: ${ EL 表达式} 它的特点: 1自动转换类型, 2使用简单. 2 EL表达式具有类型无关性,可以使用“.”或者“[]”操作符在相应的作用域(page , requ ...
- git 拉取某个分支到本地
git 拉取其实只需要 git fetch origin xxx. git pull origin xxx即可
- Javascript 浏览器检测
推荐 Browser Detecter, 很好用,自己也很容易扩展. 原文链接:http://www.quirksmode.org/js/detect.html <script type=&qu ...
- EasyUI 列表展示及基本格式
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- shell脚本通过expect脚本实现自动输入密码(使用expect)
背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现 一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具. ...
- Idea多个module下maven的pom.xml失效的问题
今天在Idea中配置spring-cloud时,配置了两个module,结果其中一个module的pom.xml失效了.. 解决方法: 1.点击Idea右侧的Maven Project 2.点击&qu ...
- Python float() 函数
Python float() 函数 Python 内置函数 描述 float() 函数用于将整数和字符串转换成浮点数. 语法 float()方法语法: class float([x]) 参数 x - ...
- keras—多层感知器MLP—MNIST手写数字识别
一.手写数字识别 现在就来说说如何使用神经网络实现手写数字识别. 在这里我使用mind manager工具绘制了要实现手写数字识别需要的模块以及模块的功能: 其中隐含层节点数量(即神经细胞数量)计算 ...
- DAO层注入HibernateTemplate的两种方式
-------------------------siwuxie095 DAO 层注入 HibernateTemplat ...