[LeetCode]376. 擺動序列(動態規劃/貪心)
函數語言程式設計思想
強調的是做什麼,而不是以什麼樣的方式來做,它忽略了面向物件的複雜語法,只要能夠獲取到結果,誰去做的,怎麼做的,都不重要,重要的是結果,不重視過程
冗餘的Runnable程式碼
傳統的寫法
public class Demo01Runnable{ public static void main(String[] args){ new Thread(new Runnable(){ @Override public void run(){ System.out.println("開啟了一個新的執行緒") } }).start();//啟動新執行緒 } }
程式碼分析:
對於Runnable的匿名內部類用法,可以分析出以下內容:
Thread類需要Runnable介面作為引數,其中的抽象方法run用來指定執行緒任務內容的核心。
為了指定run方法的方法體,不得不需要Runnable介面的實現類
為了省區定義一個RunnableImpl實現類的麻煩,不得不使用匿名內部類
必須要寫抽象方法run方法,所以方法的名稱、方法的引數、方法的返回值不得不再寫一遍,且不能寫錯
從這裡可以,只有方法體才是執行緒任務的關鍵性內容
程式設計思想的轉換
做什麼,而不是怎麼做
我們真正希望做的事情是:將run方法體內的程式碼傳遞給Thread類知曉能夠載入到即可。
傳遞一段程式碼---這是我們真正的目的。
我們需要將程式關注的重點從怎麼做迴歸到做什麼的本質上,過程與形式並不重要
2014年3月Oracle官方所釋出的Java 8(JDK1.8)中,加入了Lambda表示式
體驗Lambda表示式的更優寫法
Java 8新特性,優化剛才的程式碼
new Thead(() -> { System.out.println("開啟了一個新的執行緒"))}.start();
從上面的程式碼可以看出:沒有建立介面實現類物件的操作,也不再有抽象方法覆蓋重寫的操作,只寫了執行緒任務的內容
從上面的程式碼能夠推匯出Lambda的語法:
() -> System.out.println("開啟了一個新的執行緒");
前面的一對小括號即run方法,引數為無,裡面是空的,此時不需要任何的條件
中間的一個箭頭代表將前面的引數傳遞給後面的程式碼
後面的輸出語句即業務邏輯程式碼(執行緒任務內容)
Lambda的標準格式
格式由三個部分組成:
- 一些引數
- 一個箭頭
- 一段程式碼
Lambda表示式的標準格式:
(引數型別1 引數名稱1,引數型別2 引數名稱2,....) -> {程式碼語句}
格式說明:
小括號內的語法與傳統的方法引數列表一致,無引數就留空,多個引數則用逗號隔開
->是新引入的語法格式,代表指向的動作
大括號的語法與傳統方法體要求基本一致。
Lambda省略格式
可推導即可省略
Lambda強調的是"做什麼",而不是怎麼做,所以凡是可以根據上下文推導得知的資訊,都可以省略比如:
invokeSum(3.14,3.15,(double d1,double d2) -> {
return d1+d2;
})
//省略格式表達
invokeSum(3.14,3.15,(d1,d2) -> d1 + d2);
省略的規則:
在Lambda標準格式的表示式的基礎上,使用省略寫法的規則是:
1.小括號內參數的型別可以省略。
-
如果小括號內有且僅有一個引數,則小括號也可以省略
-
如果大括號有且僅有一個語句,則無論是否有返回值,都可以省略大括號,return關鍵字和語句的分號
Lambda的使用前提
Lambda的語法非常的簡潔,使用非常的簡單,但是有以下注意事項:
1.使用Lambda必須具有介面,且要求介面中有且僅有一個抽象方法
無論JDK內建的Runnable、Comparator介面還是自定義的介面,只有當介面中的抽象方法存在且 唯一才可以使用Lambda
2.使用Lambda必須具有上下文推斷
也就是方法的引數或者區域性變數型別必須為Lanmbda對應的介面型別,才能使用Lambda作為該介面的例項
備註: 如果有且僅有一個抽象方法的介面,稱為函式式介面
File類
概述
java.io.File類是檔案和目錄經名的抽象表示,主要用於檔案和目錄的建立、查詢、刪除等操作
Java是把電腦中的檔案和資料夾(目錄)封裝為了一個File類,我們可以使用File類對檔案和資料夾進行操作。
可以使用File類的方法:
- 建立一個檔案、資料夾
- 刪除一個檔案、資料夾
- 獲取一個檔案、資料夾
- 判斷檔案、資料夾是否存在
- 對資料夾進行遍歷
- 獲取檔案的大小
File類是一個與系統無關的類,任何的作業系統都可以使用這個類中的方法。
構造方法
public File(String pathname); 通過將給定路徑名字串轉換為抽象路徑名來建立一個新 File
例項。
public File(String parent,String child);根據 parent 路徑名字串和 child 路徑名字串建立一個新 File
例項。
public File(File parent,String child); 根據 parent 抽象路徑名和 child 路徑名字串建立一個新 File
例項。
程式碼示例:
常用API方法
獲取功能的方法
判斷功能的方法
路徑功能的方法
建立刪除的方法
目錄遍歷功能的方法
獲取功能的方法
public String getAbsolutePath();返回此抽象路徑名的絕對路徑名字串。
public String getPath();將此File轉換為路徑名字串
public String getName();返回由File表示的檔案或目錄的名稱
public long length();返回此File表示的檔案的長度。
判斷功能的方法
public boolean exists();判斷File表示的檔案或者資料夾是否實際存在
public boolean isDirectory();判斷此File表示的資料夾是否存在
public boolean isFile();判斷此File表示的檔案是否存在
建立和刪除檔案的功能和方法
public boolean createNewFile();當前僅當具有該檔名稱的檔案不存在時,建立一個新的空的檔案,返回值true
public boolean delete() 刪除由此File表示的檔案或者目錄
public boolean mkdir();建立由此File表示的資料夾
public boolean mkdirs();建立由此File表示的資料夾,包括任何必須但是又不存在的父目錄。
目錄的遍歷
public String[] list();返回一個String陣列,表示該File目錄中的所有的子目錄或者是子檔案
public File[] listFile();返回一個File陣列,表示該File目錄中的所有的子目錄或者是子檔案。