20155215 2016-2017-2 《Java程序设计》第7周学习总结

20155215 2016-2017-2 《Java程序设计》第7周学习总结

教材学习内容总结

第十二章

  • lambda语法:Lambda去重复,回忆DRY原则,Lambda表达式可读性更好

  • Arrays.sort

    • Comparator: 对比C语言中使用函数指针
    • 匿名类与多态
  • 在Java中引入Lambda的同时,与现有API维持兼容性是主要考虑之一。

  • 方法引用(Method Reference) 一条语句用Lambda表达式,多条语句用方法引用

  • 函数接口(Functional Interface)

    • 就是只有一个抽象方法的接口:Runnable、Callable、Comparator
    • @FunctionalInterface
    • 可引用的包括类的静态方法、成员方法、构造方法
  • 接口默认方法(Default Method):不能使用类的成员变量

  • 使用Optional代替null

  • 标准API的函数接口

    • Consumer:一个参数,无返回值
    • Function:一个参数,有返回值
    • Predicate:一个参数,有返回值,返回值- 必须是boolean类型的
    • Supplier:无参数,有返回值
  • Stream与管道

  • Lambda与并行处理

第十三章

  • 时间的度量,年历简介。
  • 想要取得系统时间,方法之一是使用System.currentTimeMillis()方法,返回的是long类型整数。
    P429
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());
    }
}

运行结果

  • 有关字符串时间格式的处理,职责落在了Java.text.DateFormat身上。
import java.util.*;
import static java.lang.System.out;
import static java.text.DateFormat.*;

public class DateFormatDemo {
    public static void main(String[] args) {
        Date date = new Date();
        dateInstanceDemo(date);
        timeInstanceDemo(date);
        dateTimeInstanceDemo(date);
    }
    
    static void dateInstanceDemo(Date date) {
        out.println("getDateInstance() demo");
        out.printf("\tSHORT: %s%n", getDateInstance(LONG).format(date));
        out.printf("\tSHORT: %s%n", getDateInstance(SHORT).format(date));
    }

    static void timeInstanceDemo(Date date) {
        out.println("getTimeInstance() demo");
        out.printf("\tLONG: %s%n", getTimeInstance(LONG).format(date));
        out.printf("\tMEDIUM: %s%n", getTimeInstance(MEDIUM).format(date));
        out.printf("\tSHORT: %s%n",getTimeInstance(SHORT).format(date));
    }
    
    static void dateTimeInstanceDemo(Date date) {
        out.println("getDateTimeInstance() demo");
        out.printf("\tLONG: %s%n", 
           getDateTimeInstance(LONG, LONG).format(date));
        out.printf("\tMEDIUM: %s%n",
           getDateTimeInstance(SHORT, MEDIUM).format(date));
        out.printf("\tSHORT: %s%n",
           getDateTimeInstance(SHORT, SHORT).format(date));
    }
}

运行截图

  • 处理时间日期的Calendar
  • 使用Java.util.TimeZone的getDefault()来取得默认时区信息。取得指定时区的TimeZone实例,可以取得ID字符串。
  • 机器时间观念的API和人类时间观念的API
  • 对时间的运算。

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

第十二章

  • 问题1:Lambda语法的优势在哪里?
  • 问题1解决方案:取得语法的简洁,增加代码程序的表达性,引入更简单的表达式和局部变量的定义规则,定义更灵活更友善的语法,这里只是回避,类加载和实例化本身不可避免,允许用户使用最终有效的局部变量。

第十三章

  • 问题2:Java8与以前相比在时间处理上做了哪些改进?
  • 问题2解决方案:Java 的日期与时间 API 问题由来已久,Java 8 之前的版本中关于时间、日期及其他时间日期格式化类由于线程安全、重量级、序列化成本高等问题而饱受批评。Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了了日期时间和本地化的管理。

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

  • 问题1:我在运行第十三章的程序时出现了编译错误:

  • 问题1解决方案:我在网上找到了这个,Java命令行编译文件时出现的错误,找不到符号或软件包不存在等

  • 问题2:在编译Timezone程序时报错如下:

  • 问题2解决方案:我发现我文件名打错了,然后还有一个地方多打了一行重复的内容,修改之后就编译成功了。运行结果如下:

代码托管

上周考试错题总结

  • 1.下面哪条命令可以把 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
    答案:AC

我只选择了A。copy是Windows下的命令。cat f1.txt > f2.tx 通过输出重定向实现了复制。

  • 7.调用线程的interrupt()方法 ,会抛出()异常对象?
    A .
    IOException
    B .
    IllegalStateException
    C .
    RuntimeException
    D .
    InterruptedException
    E .
    SecurityException
    答案:DE

我只选择了D,SecurityException检测到安全错误时引发的异常。

  • 10.Given an instance of a Stream, s, and a Collection, c, which are valid ways of creating a parallel stream? (Choose all that apply.)
    给定一个Stream的实例s, 一个Collection的实例c, 下面哪些选项可以创建一个并行流?
    A .
    new ParallelStream(s)
    B .
    c.parallel()
    C .
    s.parallelStream()
    D .
    c.parallelStream()
    E .
    new ParallelStream(c)
    F .
    s.parallel()
    答案:DF
    我选了AB

  • Which of the following statements about the Callable call() and Runnable run() methods are correct? (Choose all that apply.)
    A .
    Both can throw unchecked exceptions.
    B .
    Callable takes a generic method argument.
    C .
    Callable can throw a checked exception.
    D .
    Both can be implemented with lambda expressions.
    E .
    Runnable returns a generic type.
    F .
    Callable returns a generic type.
    G .
    Both methods return void
    答案:ACDF
    我的答案是CF,显然我对题目的理解不够,还需要更深入地学习

  • 14.Which of the following are not java.io classes? (Choose all that apply.)
    答案是PrintWriter
    因为PrintWriter是唯一Writer类,没有互补reader类,E是正确的。

  • Which of the following are built-in streams in Java? (Choose all that apply.)
    A .System.err

B .System.error

C .System.in

D .System.input

E .System.out
F .System.output
答案:ACE
The System class has three streams: in is for input, err is for error, and out is for output. Therefore A, C, and E are correct. The others do not exist.

结对及互评

评分标准

  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
    • ...
  • 代码中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

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

这周的学习状态感觉比之前要好一些,另一方面这周的学习内容也相对简单一些。然后这周的测试,我只有九分,虽然这九分还排了个第六名,但是我知道我还要很多的不足需要努力,希望我能再接再励继续进步。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第四周 300/500 2/4 18/38
第五周 515/1396 3/7 22/30
第六周 845/2012 1/9 24/30
第七周 734/2746 2/11 27/28

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:28小时

  • 实际学习时间:27小时

  • 改进情况:这周的学习状态感觉比之前要好一些,花的时间更长了一些。

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

参考资料

posted @ 2017-04-08 12:36  xuanyan  阅读(252)  评论(6编辑  收藏  举报