zoukankan      html  css  js  c++  java
  • 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 掌握日期和时间的运用

    参考资料

  • 相关阅读:
    从习总书记讲话学习表达
    Struts——(四)异常处理机制
    Struts框架——(三)动态ActionForm
    Struts框架——(二)Struts原理with登录实例
    Serializable接口和transient关键字
    转发(forward)和重定向(sendRedirect)
    Struts框架——(一)用Servlet + JSP演示Struts基本原理
    Cookie & Session
    Servlet
    SSH框架
  • 原文地址:https://www.cnblogs.com/nostalgia-/p/5402108.html
Copyright © 2011-2022 走看看