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小時

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索