簡單理解Java Lambda表示式的形成
阿新 • • 發佈:2018-12-01
Lambda表示式由於語法表示比較另類,初看時會不太理解。Java官方文件提供了從內嵌類到匿名類,再到Lambda表示式簡潔清晰的描述,很有助於理解。
內嵌類 (nested/inner class)
Java支援類內嵌其它類定義,即在一個類中定義另一個類,如下,在OuterClass中定義了NestedClass,NestedClass即為內嵌類
Class OuterClass{
…
Class NestedClass{
…}
…
}
以上類定義方式也有叫成員內嵌類(member inner class)。
本地類(local class)
本地類出現在塊(block)中,常見的就是在類的方法中出現,如下示,在類LocalClassExample的方法validatePhoneNumber中定義了一個本地類PhoneNumber
//Local Class Example public class LocalClassExample { static String repalceChar = "-"; public static void FormatPhoneNumber( String phoneNumberStr) { final int numberLength = 10; class PhoneNumber { String formattedPhoneNumber = null; PhoneNumber(String phoneNumber) { formattedPhoneNumber = phoneNumber.replace( repalceChar, ""); } public String getNumber() { return formattedPhoneNumber; } } PhoneNumber myNumber1 = new PhoneNumber(phoneNumberStr); if (myNumber1.getNumber() == null) { System.out.println("First number is invalid"); } else { System.out.println("First number is " + myNumber1.getNumber()); } } public static void main(String[] args) { FormatPhoneNumber ("123-456-7890"); } }
匿名類(anonymous class)
匿名類與本地類相似,也出現在塊中,但是沒有類名。
匿名類定義一個介面的實現,或一個類的擴充套件(例如重寫類的方法)。
如下示,先定義一個PhoneNumber介面,在validatePhoneNumber方法中使用時,new PhoneNumber() 後直接實現介面中的方法。
//Anonymous class example public class AnonymousClassExample { static String repalceChar = "-"; interface PhoneNumber { public String transferAndValidNumber(String phoneNumber); } public static void formatPhoneNumber( String phoneNumberStr) { final int numberLength = 10; PhoneNumber myNumber = new PhoneNumber() { public String transferAndValidNumber(String phoneNumber) { return phoneNumber.replace(repalceChar, ""); } }; System.out.println("my number is:" + myNumber.transferAndValidNumber(phoneNumberStr)); } public static void main(String[] args) { formatPhoneNumber("123-456-7890"); } }
Lambda表示式
當匿名類實現的介面中的方法只有一個方法時,可採用Lambda表示式實現。Lambda進一步簡化程式碼編寫。
如上面匿名類方法可以採用如下Lambda表示式代替。
可以將上面匿名類程式碼段
PhoneNumber myNumber = new PhoneNumber() {
public String transferAndValidNumber(String phoneNumber) {
return phoneNumber.replace(repalceChar, "");
}
};
修改為如下Lambda方式:
PhoneNumber myNumber = (String phoneNumber) -> phoneNumber.replace(repalceChar, "");
在Lambda表示式中,省略了new 類名,以及方法名。
以上入參只有一個phoneNumber, 可以去掉入參型別及括號,進一步簡化如下:
PhoneNumber myNumber = phoneNumber -> phoneNumber.replace(repalceChar, "");
參考:
Oracle Java文件