教材学习内容总结

第十二章 Lambda

12.1 认识Lambda语法

- Lambda 教材的引入循序渐近、深入浅出

  • 如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例:
    Comparator<String>byLength = (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中被引入,它可以这么使用:

      @FunctionalInterfacepublic 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/26out.println(calendar.get(Calendar.YEAR));     //2014out.println(calendar.get(Calendar.MOUNTH));   //Calendar.MAY的值4out.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()复制对象的动作。执行结果如下:

代码托管

上周考试错题总结

  • 调用线程的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

  • 参考示例

点评过的同学博客和代码

  • 本周结对学习情况

    • [20155311]
    • 结对照片
    • 结对学习内容
      • Lambda
      • 时间与日期
  • 上周博客互评情况
    其他5人博客都很好
  • 李晓莹20155318
  • 刘子健20155314
  • 潘滢昊20155210
  • 滕树晨20155301
  • 徐子涵20155208

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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就接近了。

参考:软件工程软件的估计为什么这么难,软件工程 估计方法

  • 计划学习时间:32小时

  • 实际学习时间:31小时

  • 改进情况:本周有实验,所以计划提高了学习时间,但是除实验外的代码就编写比上周少了,学习时间有所提高的。

(有空多看看现代软件工程 课件
软件工程师能力自我评价表)

参考资料

  • Java学习笔记(第8版)

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

转载于:https://www.cnblogs.com/20155305ql/p/6676015.html

20155305乔磊2016-2017-2《Java程序设计》第七周学习总结相关推荐

  1. 20155305乔磊2016-2017-2《Java程序设计》第二周学习总结

    20155305乔磊 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 第三章学习了基本类型 整数(short.int.long) 字节(byte) 浮点数(f ...

  2. 20155305乔磊2016-2017-2《Java程序设计》第九周学习总结

    20155305 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC入门 JDBC简介 1.JDBC是java联机数据库的标准规范,它定义了一组标准类与 ...

  3. 20175317 《Java程序设计》第一周学习总结

    20175317 <Java程序设计>第一周学习总结 教材学习内容总结 本周学习了Java大致的开发步骤,完成了课件自带的习题. 学习了在windows与Linux系统下不同的编译方法,掌 ...

  4. 20155227 2016-2017-2 《Java程序设计》第九周学习总结

    20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...

  5. 20172318 2016-2017-2 《Java程序设计》第一周学习总结

    20172318 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 在教材中基本明白了计算机系统的运行方式,了解了对于高级语言是使用是掌握好编程的关键,掌握了一 ...

  6. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  7. 20175208 《Java程序设计》第九周学习总结

    20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...

  8. 20175204 张湲祯 2018-2019-2《Java程序设计》第九周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第九周学习总结 教材学习内容总结 -第十一章JDBC和MySQL数据库要点: 1.下载MySQL和客户端管理工具navi ...

  9. 20155313 2016-2017-2 《Java程序设计》第二周学习总结

    20155313 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 1.1 基本类型 整数:可细分为short整数(占2字节).int整数(占4字节)与long ...

  10. 20155226 2016-2017-2 《Java程序设计》第一周学习总结

    20155226 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周主要学习了一二章的内容,也浏览了剩余章节,以下是本周主要学习内容总结 1.首先了解了[ ...

最新文章

  1. 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3
  2. 不是计算机专业学python能找到工作吗-非计算机行业为什么要转行学习Python编程...
  3. 揭开雷达的面纱(科普)探测能力
  4. 《Oracle高性能自动化运维》一一3.3 Redo产生场景
  5. 【转】使用EBNF相对于BNF表示的优越性
  6. 连接串口_气压计PTB330连接HMI串口屏
  7. mysql-mmm官方安装指南翻译
  8. Java游戏程序设计 第3章 游戏程序的基本框架
  9. 邮件管理数据库设计--MySQL
  10. Modelsim10.4-win64软件下载安装与破解
  11. [BScroll warn]: Can not resolve the wrapper DOM. 的解决
  12. rls自适应滤波器matlab实现,rls算法的自适应滤波器matlab仿真作业.doc
  13. stm32 火灾自动报警及联动控制源码_火灾自动报警系统怎么进行消防联动控制设计...
  14. grunt源码解析1——如何安装grunt:grunt命令是怎样运行起来的
  15. 什么是DNS污染?DNS污染的解决方法
  16. 三亚适合几月份去玩 三亚必去的地方是哪里
  17. JavaScript--点击颜色,为主题更换背景颜色
  18. java 设计模式之: 建造模式(Builder)
  19. 学PHP时,端口被占用,怎么找端口的占用情况。
  20. Ubuntu系统在终端查看一些软硬件版本或文件大小的指令!

热门文章

  1. JS中的Error对象
  2. 周期性行业是什么意思_什么样的股票适合长期持有?股票知识学习
  3. kafka消息堆积原因解析
  4. scala 模式匹配概念及用法示例
  5. CFFI - ABI模式与API模式
  6. eclipse adt开发android ndk没有NDK选项问题的解决方案
  7. 理解与学习linux 文件系统的目录结构
  8. 一个比较好的多人网络游戏菜单程序。
  9. MySQL-5.6.14-winx64的免安装配置方法
  10. RMAN-06217: 错误