1. 程式人生 > >簡單理解Java Lambda表示式的形成

簡單理解Java Lambda表示式的形成

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文件