20145221 《Java程序设计》第七周学习总结

20145221 《Java程序设计》第七周学习总结

教材学习内容总结

第十二章部分 - Lambda

认识Lambda语法

  • Lambda去可以重复,符合DRY原则,而且Lambda表达式可读性更好,操作更简单
  • 匿名类型最大的问题就在于其冗余的语法,lambda表达式是匿名方法,它提供了轻量级的语法,从而解决了匿名内部类带来的冗余问题。
  • 示例:
(int x, int y) -> x + y;
() -> 42;
(String s) -> { System.out.println(s); 

第一个lambda表达式接收x和y这两个整形参数并返回它们的和;第二个lambda表达式不接收参数,返回整数'42';第三个lambda表达式接收一个字符串并把它打印到控制台,不返回值。

  • 接口默认方法:在JDK8中,interface定义时可以加入默认操作,或者称为默认方法(Default methods),forEach()方法本身已有操作,所以不会破坏Iterable现有的其他操作。在默认方法中不能使用数据成员,因为接口本身不能定义数据成员,也就是默认方法中不能用直接变更状态的流程。

Functional与Stream API

  • 使用Optional代替null
  • 标准API的函数接口
    • Consumer:一个参数,无返回值
    • Function:一个参数,有返回值
    • Predicate:一个参数,有返回值,返回值必须是boolean类型的
    • Supplier:无参数,有返回值
  • Stream与管道

Lambda与并行处理

第十三章部分 - 时间与日期

认识时间与日期

  • 时间的度量
    • 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毫秒数
  • 日历
    • 儒略历(Julian Calendar)
      儒略历是现今公历的前身,用来取代罗马历,修正了罗马历隔三年设置一闰年的错误,改采四年一闰。
    • 格里高利历(Gregorian Calendar)
      格里高利历将儒略历1582年10月4日星期四的隔天,订为格里高利历1582年10月15日星期五。
    • ISO8601 标准
      ISO 8601并非年历系统,而是时间日期表示方法的标准,用意统一时间日期的数据交换格式。在ISO 8601标准的定义中,19世纪是指1900年到1999年,而格里高利历的19世纪是指1801年到1900年。

认识Date与Calendar

  • 时区:考虑了UTC偏移的时间表示上,通常会标识Z符号。
  • Date与DateFormat
    • Date:使用System.currentTimeMillis()方法,返回的是long类型的整数,代表1970年1月1日00:00:00至今经过的毫秒数,只用来获取epoch毫秒数。
    • DateFormat是个抽象类,其操作类是java.text.SimpleDateFormat,用来格式化成人类理解的年月日时分秒。
  • Calendar: 时间的运算
    • getInstance(): 要取得某个时间日期资讯,或者是对时间日期进行操作,可以使用Calendar实例,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例
    • getTime():取得Calendar实例后,可以使用getTime()取得Date实例
    • get():如果想要取得年月日等日期时间字段,可以使用get()方法指定Calender上的字段枚举常数
    • add():改变实例的时间
    • roll():如果打算只针对日期中某个字段加减,则可以使用roll()方法
    • after():比较两个实例的日期先后
    • before():比较两个实例的日期先后
    • ...

JDK8新时间日期API

  • 机器时间 Instant
    • Calendar的getTime()返回false实例,取得Date实例,下一步应该获取时间信息,应该是通过Date的getTime()取得epoch毫秒数
    • 用以代表自定义的Java epoch之后的某个时间点历经的毫秒数,精确度基本上是毫秒。使用Instant的静态方法now()取得代表Java epoch毫秒数的Instant实例,取得Instant实例后,可以使用plusSeconds()、plusMillis()、plusNanos()、minusSeconds()、minusMillis()、minusNanos()来做时间轴上的运算,Instant实例本身不会变动,这些操作会返回新的Instant实例,代表运算后的瞬时
  • 人类时间(ISO8601 标准)
    • LocalDateTime:包括日期与时间
    • LocalDate:只有日期
    • LocalTime:只有时间
    • ZonedDateTime:时区的日期与时间
    • OffsetdateTime:代表UTC偏移量
    • Year:表示年
    • YearMonth:表示年月
    • Month:表示月
    • MonthDay:表示月日

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

问题一:

  • 教材P435页提到“想比较两个Calendar的时间日期先后,可以使用after()before()方法”,但是书中没有给出具体的例子,不知道是什么用法,应该传入什么样的参数。不过通过查询API可知:

  • 从而也可以推测出before()的用法,与after()恰好相反。

问题二:

  • 教材p430页DateFormatDemo.java代码运行结果:

  • 这段代码与书中的格式不同,上述输出应该是正确的。

问题三:

  • 教材p436页TimeZoneDemo.java代码运行结果:

  • 时区ID显示的是Asia/Shanghai,为什么不是北京呢?通过查阅相关资料,发现Java所支持的所有时区ID里面并没有Asia/Beijing,所以对于中国大陆时区的而言,显示的应该都是Asia/Shanghai

其他(感悟、思考等,可选)

  • 这周内容因为只要求一章内容,学习任务相对来说较为轻松。本次接触到了Java中的时间,认识到Java中对时间的处理机制,感觉Java还是很严谨细致的,时间虽然很重要,但在平时真的很少有专门关注到它,这次通过Java的学习,从时间到时区都大致了解了一下,也对Java中的处理方式有了初步的理解。

  • Java后面的知识还是不能活学活用,用起来比较生疏,或是用的时候已经记不清楚书中所讲。就像最近我感觉我对C语言的掌握加强了一样,因为其余几门实验都是用C编的,也只有反复应用才可能提升编程技术了。所以Java的提高,需要以后多实践,在实践中总结经验,提升能力。

  • 【附1】托管截图:

  • 【附2】用cloc.exe统计代码如下:

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/6 20/20 学会MarkdownPad2
第二周 150/350 1/7 15/35 理解了补码机制
第三周 500/850 1/8 25/60 初步了解了对象
第四周 1231/2081 1/9 27/87 初步了解了继承与接口
第五周 749/2930 3/12 30/117 了解了异常处理
第六周 1057/3987 2/11 24/111 初步了解输入输出与线程
第七周 371/4358 3/14 25/136 了解Java中的时间

参考资料

原文地址:https://www.cnblogs.com/20145221GQ/p/5402245.html