1. 程式人生 > 實用技巧 >Java基礎(二十二) Lambda表示式和File類

Java基礎(二十二) Lambda表示式和File類

函數語言程式設計思想

   強調的是做什麼,而不是以什麼樣的方式來做,它忽略了面向物件的複雜語法,只要能夠獲取到結果,誰去做的,怎麼做的,都不重要,重要的是結果,不重視過程。

冗餘的Runnable程式碼

  傳統的寫法:

 1 public class Demo01Runnable{
 2     public static void main(String[] args){
 3             //匿名內部類的方式
 4             new Thread(new Runnable(){
 5                 @Overrride 
 6                 public
void 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標準格式的表示式的基礎上,使用省略寫法的規則是:

  1. 小括號內參數的型別可以省略。
  2. 如果小括號內有且僅有一個引數,則小括號也可以省略
  3. 如果大括號內有且僅有一個語句,則無論是否有返回值,都可以省略大括號、return關鍵字和語句的分號。

Lambda的使用前提

  Lambda的語法非常的簡潔,使用非常的簡單,但是有以下注意事項:

    1.使用Lambda表示式必須具有介面,且要求介面中有且僅有一個抽象方法,無論JDK內建的Runnable、Comparator介面還是自定義的介面,只有當介面中的抽象方法存在且唯一,才可以使用Lambda

    2.使用Lambda必須具有上下文推斷。也就是方法的引數或者是區域性變數型別必須為Lambda對應的介面型別,才能使用Lambda作為該介面的例項。

   備註:如果有且僅有一個抽象方法的介面,稱為函式式介面

File類

概述

  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 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() 返回由此抽象路徑名錶示的檔案或目錄的名稱。

  • 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目錄中的所有的子目錄或者子檔案。