1. 程式人生 > 實用技巧 >[LeetCode]376. 擺動序列(動態規劃/貪心)

[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.小括號內參數的型別可以省略。

  1. 如果小括號內有且僅有一個引數,則小括號也可以省略

  2. 如果大括號有且僅有一個語句,則無論是否有返回值,都可以省略大括號,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目錄中的所有的子目錄或者是子檔案。