简单理解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文档

猜你喜欢

转载自blog.csdn.net/weixin_41722302/article/details/82887843
今日推荐