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

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

教材学习内容总结

Lambda

  • 方法参考的特性,在重用现有的API上扮演了重要的角色。重用现有方法操做,能够避免处处写下lambda表达式。方法参考不只避免了重复撰写lambda表达式,也可让程序代码更为清楚。html

  • 在只有lambda表达式的状况下,参数的类型必须写出来,若是有目标类型的话,在编译程序能够推断出类型的状况下能够不写出lambda表达式的参数类型。lambda表达式自己是中性的,不表明任何类型的实例,一样的lamb表达式能够用来表示不一样目标类型的对象操做。java

  • lambda并无导入新类型来做为lambda表达式的类型,而是就现有的interface语法来定义函数接口,做为lambda表达式的目标类型。函数接口就是接口,可是要求仅仅具备单一抽象方法,许多现存的接口都是这种接口,例如标准API中的Runnable、Callable、Comparator等。git

  • 匿名类有其应用的场合,在许多时候特别是接口只有一个的方法要操做时,只需关心参数和操做自己而不是雷和方法名称,lambda表达式只关心方法命名上的参数和返回定义,但忽略方法名称。windows

  • JDK8对interface语法作了演进容许有默认方法操做。ide

  • lambda表达式并非匿名类的语法蜜糖。认为lambda表达式是在哪一个名称范畴就能参考该范畴内的名称,像是变量和方法。在JDK8中,若是变量自己等效于final局部变量也就是说,若是变量不会再匿名类中又从新指定的动做,就能够不用加上final关键词。若是lambda表达式中捕获的局部变量自己等效于final局部变量,能够不用再局部变量上加上final。在lambda中不能修改局部变量的值。函数

  • 只要静态方法的方法名称命名中参数和返回值定义相同,也可使用静态方法来定义函数接口操做。学习

  • 除了参考静态方法做为函数接口操做以外,还能够参考特定对象的实例方法。函数接口操做也能够参考类上定义的非静态方法,函数接口会试图用第一个参数方法接收者,而以后的参数依次做为被参考的非静态方法的参数。JDK8还提供了构造函数参考,用来重用现有API的对象构建流程。ui

  • 调用方法时若是返回类型是Optional,它可能包含值也可能不包含值。JDK8中定义的通用函数接口,基本上放置于java.util。function套件之中,就行为来讲,基本上能够分为Consumer、Function、Predicate与Supplier四个类型。.net

  • JDK8中引入StreamAPI,也引入了管道操做风格,一个管道基本上包括了几个部分:来源,零或多个中间操做,一个最终操做。线程

时间与日期

  • GMT时间如今已经不做为标准时间使用,但GMT时间经常被当成UTC时间。在导入UTC时间以前,GMT和UT是相同的。UTC时间是具备折中修正版本的世界协调时间,这是为了保持TAI和UT时间不要相差太大,UTC时间采用了闰秒修正。

  • Unix系统的时间表示法定义为UTC时间的1970年1月1日0时0分0秒为起点通过的秒数,不考虑闰秒修正,用以表达时间轴上的某一瞬间。Epoch为某个特定时代的开始,时间轴上的某一瞬间。各个国家修改日历的时间并不相同,因此在Unix或者Linux中查询1752年9月会发现时间少了11天。

  • ISO8601在严格意义上并不是年历系统而是时间日期表示方法的标准,用以统一时间日期的数据交换格式,ISO8601在数据定义上大部分与格里高日历相同,但有些细微差异。在ISO8601的定义中19世纪是1900-1999年,而在格里高日历中19世纪是1801-1900年。

  • 取得系统时间的方法之一是使用System.currentTimeMillis()方法返回的是long类型的整数表示从1970年1月1日0时0分0秒到如今通过的毫秒数。时间起点和Unix时间起点是相同的,此方法得到的时间是机器观点表明时间轴上的某一瞬间,对人类来讲没有阅读意义。

  • JDK8新时间日期处理API中最重要的就是清楚地将机器对时间的概念和人类对时间的概念区分开来,让时间与人类对时间的概念的界限变得分明。

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

  • 假设actionPerformed()方法的返回类型是void,对于如下代码该如何作特殊处理?在ui.showSomething();左右加上花括号。果不加的话,若showSomething()方法返回值是整数类型,那么就意味着actionPerformed()返回整数类型,显然不是,因此必须加花括号用来标记。
Button bt = new Button();
bt.addActionListener(event -> { ui.showSomething(); });
  • 若是Lambda表达式主体部分包含多条语句,也必须用花括号,而且return语句不能省。
File dir = new File("/an/dir/");
File[] dirs = dir.listFiles((File f) ->  
{ 
                                            System.out.println("Log:...");
                                            return f.isDirectory(); 
                                         }
);

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

  • 关于使用Lambdas排序集合的问题:根据成员的name, surname, name长度以及最后一个字母,使用Comparator 类来排序集合,首先根据name来排序list。

  • 不用lambda表达式的办法:

String[] players = 
{   "Rafael Nadal", "Novak Djokovic",   
    "Stanislas Wawrinka", "David Ferrer",  
    "Roger Federer", "Andy Murray",  
    "Tomas Berdych", "Juan Martin Del Potro",  
    "Richard Gasquet", "John Isner"};  
Arrays.sort(players, new Comparator<String>()
{  
    @Override  
    public int compare(String s1, String s2) {  
        return (s1.compareTo(s2));  }  
    });
  • 使用lambda表达式的办法:
Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2));  
Arrays.sort(players, sortByName);  
//或者用另一种写法
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

代码托管

上周考试错题总结

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

    copy是Windows下的命令。cat f1.txt > f2.tx 经过输出重定向实现了复制,故选A和C

2.下面代码中共有()个线程?

public class ThreadTest {
    public static void main(String args[]){
        MyThread myThread =new MyThread();
        Thread t1=new Thread(myThread);
        Thread t2=new Thread(myThread);
        t1.start();
        t2.start();
    }
}
class MyThread extends Thread {
    ...
}
  • A .1

  • B .2

  • C .3

  • D .4

除了t1,t2, 不要忘了main所在的主线程,故选C

3.如下()方法会使线程进入阻塞状态?

  • A .Thread.sleep()

  • B .wait()

  • C .notify()

  • D .interrupt()

答案A和B

结对及互评

评分标准

  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分

点评过的同窗博客和代码

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 20篇 400小时
第一周 10/10 1/4 12/12
第二周 120/130 1/5 9/21
第三周 210/340 1/6 9/30
第四周 460/800 1/7 9/39
第五周 400/1200 1/8 9/48
第六周 300/1500 1/9 9/57
第七周 300/1800 1/10 9/66

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

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

  • 计划学习时间:9小时

  • 实际学习时间:9小时

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

参考资料

相关文章
相关标签/搜索