20145211 《Java程序设计》第7周学习总结——沧海横流

教材学习内容总结

Lambda

  • Arrays的sort()方法可以用来排序,在使用sort()时,需要操作java.util.Comparator来进行说明,这样一来,语法就显得有些冗长。在JDK8中,可以使用Lambda语法改变Arrays.sort()的可读性:

  • Comparator<String> byLength = (String name1,String name2)->name1.length() - name2.length(); 编译器可以从byLength变量的声明类型,推断name1与name2的类型,因此可以再简化为:

  • Comparator<String> byLength = (name1,name2)->name1.length() - name2.length();方法参考的特性,在重用现有API上扮演了重要角色。重用现有方法实作,可避免到处写下Lambda运算式,方法参考不仅避免了重复撰写Lambda表达式,也可以让程序代码更清楚.

  • Lambda表达式与函数接口:等号右边是Lambda表示式(Expression),等号左边是作为Lambda表示式的目标型态(Target type)

  • Comparator<String> byLength = (String name1,String name2)->name1.length() - name2.length(); 如果有目标型态的话,在编译器可推断出类型的情况下,就可以不写出Lambda表示式的参数型态,例如:Comparator<String> byLength = (name1,name2)->name1.length() - name2.length();
    Lambda表示式本身是中性的,不代表任何型态的实例,同样的Lambda表示式,可用来表示不同目标型态的对象操作

  • JDK8的Lambda并没有导入新类型来作为Lambda表达式的类型,而是就现有的interface语法来定义函数接口,作为Lambda表达式的目标类型。Lambda表达式只关心方法签署上的参数与返回定义,但忽略方法名称,有个新标注@FunctionalInterface在JDK8中被引入.如果接口使用了@FunctionalInterface来标注,而本身并非函数接口的话,就会引发编译错误。

  • Lambda遇上this与final:Lambda表示式并不是匿名类别的语法蜜糖,如果Lambda表示式中捕获的局部变量本身等效于final局部变量,可以不用在局部变量上加上final,JDK8特意禁止在Lambda中修改局部变量的值。

  • 方法与构造函数参考:方法参考(Method references)可以避免你到处写下Lambda表示式,尽量运用现有的API实作,也可以改善可读性。

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

时间与日期

  在写Java程序的时候总免不了与日期和时间打交道,特别是在做项目的时候,要按照各种各样的需求显示不同格式的日期和时间,一种方法是DATE另一种是CALENDAR.
SimpleDateFormat 24小时制时间显示

G Era 标志符 Text AD
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
  • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
    例:Calendar cal = Calendar.getInstance();使用默认时区和语言环境获得一个日历。
    cal.add(Calendar.DAY_OF_MONTH, -1);取当前日期的前一天.
    cal.add(Calendar.DAY_OF_MONTH, +1);取当前日期的后一天.
  • 通过格式化输出日期
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd"); 

System.out.println("Today is:"+format.format(Calendar.getInstance().getTime())); 

System.out.println("yesterday is:"+format.format(cal.getTime())); 
package net.singlex.javadate;

/**
 * 以下是利用Calendar类来实现日期时间的,和Date类相比较比较简单  

 */

import java.util.*;

public class Testdate{
    public static void main(String[] args) {

        Calendar ca = Calendar.getInstance();
        int year = ca.get(Calendar.YEAR);// 获取年份  
        int month = ca.get(Calendar.MONTH);// 获取月份  
        int day = ca.get(Calendar.DATE);// 获取日  
        int minute = ca.get(Calendar.MINUTE);// 分  
        int hour = ca.get(Calendar.HOUR);// 小时  
        int second = ca.get(Calendar.SECOND);// 秒  
        int WeekOfYear = ca.get(Calendar.DAY_OF_WEEK);

        System.out.println("用Calendar.getInstance().getTime()方式显示时间: " + ca.getTime());
        System.out.println("用Calendar获得日期是:" + year + "年" + month + "月" + day + "日");
        System.out.println("用Calendar获得时间是:" + hour + "时" + minute + "分" + second + "秒");
        System.out.println(WeekOfYear);// 显示今天是本周的第几天(从周末开始计数,我运行时是周一,故结果为2)  
    }
}  

JDK8新时间日期API

  • 机器时间观点的API:
    Date名称看来像是人类的时间概念,实际却是机器的时间概念,混淆机器与人类时间观点会引发的问题之一像是日光节约时间。
  • 不该使用Date实例的toString()来得知人类观点的时间信息,Date实例应该只代表机器观点的时间资讯,真正可靠的资讯只有内含的epoch毫秒数。
  • 人类时间观点的API:
    对于片段的日期时间,JDK8新时间与日期API有LocalDateTime()、LocalDate()、LocalTime()等类来定义,这些类基于ISO 8601年历系统,是不具时区的时间与日期定义。
    在新的时间与日期API中,UTC偏移量与时区的概念是分开的,offsetDateTime单纯代表UTC偏移量,使用ISO 8601。如果只想表示2014年,可以使用Year,如果想表示2014/5,可以使用YearMonth,如果只想表示5月,可以使用Month,如果想表示5/4,可以使用MonthDay,其中Month是enum型,如果你想要取得代表月份的数字,不要使用oridinal()方法,因为oridinal()是enum在定义时的顺序,从0开始,想要取得代表月份的数要通过getValue()方法。
  • 对时间的运算:period与Duration乍看有些难区别,period是日期差,between()方法只接受LocalDate,不表示比“日”更小的单位。然而Duration是时间差,between()方法可以接受LocalDateTime()、LocalDate()、LocalTime(),不表示比“天”更大的单位。

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

	import java.util.*;
import java.text.*;

public class Testdate2 {
    public static void main(String[] args) {

        Date now = new Date();
        Calendar cal = Calendar.getInstance();

        DateFormat d1 = DateFormat.getDateInstance(); // 默认语言(汉语)下的默认风格(MEDIUM风格,比如:2013-6-10 13:14:41)  
        String str1 = d1.format(now);
        DateFormat d2 = DateFormat.getDateTimeInstance();
        String str2 = d2.format(now);
        DateFormat d3 = DateFormat.getTimeInstance();
        String str3 = d3.format(now);
        DateFormat d4 = DateFormat.getInstance(); // 使用SHORT风格显示日期和时间  
        String str4 = d4.format(now);
        DateFormat d5 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); // 显示日期,周,时间(精确到秒)  
        String str5 = d5.format(now);
        DateFormat d6 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); // 显示日期。时间(精确到秒)  
        String str6 = d6.format(now);
        DateFormat d7 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); // 显示日期,时间(精确到分)  
        String str7 = d7.format(now);
        DateFormat d8 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); // 显示日期,时间(精确到分)  
        String str8 = d8.format(now);// 与SHORT风格相比,这种方式最好用  

        System.out.println("用Date方式显示时间: " + now);// 此方法显示的结果和Calendar.getInstance().getTime()一样  
        System.out.println("用DateFormat.getDateInstance()格式化时间后为:" + str1);
        System.out.println("用DateFormat.getDateTimeInstance()格式化时间后为:" + str2);
        System.out.println("用DateFormat.getTimeInstance()格式化时间后为:" + str3);
        System.out.println("用DateFormat.getInstance()格式化时间后为:" + str4);
        System.out.println("用DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL)格式化时间后为:" + str5);
        System.out.println("用DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG)格式化时间后为:" + str6);
        System.out.println("用DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT)格式化时间后为:" + str7);
        System.out.println("用DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM)格式化时间后为:" + str8);
    }
}  

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

这一周,感觉有点紧凑,虽然这周java学习任务比以往少了点吧,却感觉又多了点。这一周,开始重新练剑了,
有点忙,但还算是自己喜欢做的事。不多说,沧海横流,方显英雄本色;青山矗立,不堕凌云之志 。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 100/100 2/2 15/15 学会搭建Java环境,学会写一些简单程序,掌握一些小技巧
第二周 100/200 2/4 22/37 学会使用IDEA
第三周 400/650 1/5 24/61 深入了解面向对象
第四周 750/1450 1/6 30/91 理解继承、多态、接口
第五周 750/2200 2/10 30/120 接触异常处理与Map
第六周 400/2600 2/12 30/150 感悟输入输出流与线程
第七周 600/3200 1/13 16/176 掌握日期和时间的运用

参考资料

原文地址:https://www.cnblogs.com/nostalgia-/p/5402108.html