標籤:需要 lam 開啟 new 基本 try 正是 返回 logs
1.把Lambda付諸實踐:環繞執行模式
讓我們通過一個例子,看看在實踐中如何利用Lambda和行為參數化來讓代碼更加靈活,更加簡潔。資源處理(例如處理檔案或者資料庫)時一個常見的模式就是開啟一個資源,做一些處理,然後在關閉資源。這個設定和清理階段總是很類似,並且會圍繞著執行處理的那些重要代碼。這就是所謂的環繞執行(execute around)模式。如所示
例如:在以下代碼中,紅色部分就是從一個從檔案中讀取一行所需的模板代碼(注意:Java7中,帶資源的try語句,它已經簡化了代碼,因為你不需要顯示地關閉資源了)
1 public static String processFile() throws IOException{2 try(BufferedReader read = new BufferedReader(new FileReader("D://data.txt"))){3 return read.readLine();4 }5 }
上面那段代碼有局限性的。你只能讀檔案的第一行。你想要讀取檔案的前兩行,甚至是返回使用最頻繁的詞,該怎麼辦呢?在理想的情況下,你要重用執行設定和清理的代碼,並且告訴processFile方法對檔案執行不同的操作。這聽起來是不是很耳熟呢?是的,你需要把processFile的行為參數化。你需要一種方法把行為傳遞給processFile方法,以便他可以利用BufferedReader執行不同的行為。
(1).行為參數化
傳遞行為正是Lambda的拿手好戲。那要是想一次讀兩行,這個新的processFile方法看起來又該是怎麼樣的呢?基本你需要一個接收BufferedRead並且返回String的Lambda。例如,下面就是從BufferedRead中列印兩行的寫法:
String reuslt = processFile(( BufferedReader b) -> b.readLine() + b.readLine());
(2).建立函數式介面
1 public interface BufferedReaderProcessor {2 String process(BufferedReader b) throws IOException;3 }
現在你就可以把這個介面作為processFile方法的參數了:
1 public static String processFile(BufferedReaderProcessor b) throws IOException{2 3 }
(3).執行一個行為
任何BufferedReader -> String形式的Lambda都可以可以作為參數來傳遞,因為他們都符合BufferedReaderProcessor介面中定義的process方法的簽名。現在你只需要一種方法在processFile主體內執行Lambda所代表的代碼。請記住,Lambda運算式允許你直接內聯為函數式介面的抽象方法提供實現,並且將整個運算式作為函數式介面的一個執行個體。因此,你可以在processFile主體內,對傳遞過來的BufferReaderProcessor對象調用process方法執行處理:
1 public static String processFile(BufferedReaderProcessor b) throws IOException{2 try(BufferedReader br = new BufferedReader(new FileReader("D://data.txt"))){3 return b.process(br);4 }5 }
(4).傳遞Lambda
現在你就可以傳遞不同的Lambda重用professFile方法,並且以不同的方式來處理檔案。
處理一行:
1 String result = processFile((BufferedReader p) -> p.readLine());
處理兩行:
1 String reuslt = processFile(( BufferedReader b) -> b.readLine() + b.readLine());
Java8-Lambda運算式(2)