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