简单理解Java Lambda表达式的形成

本文详述了Java编程中从内嵌类、本地类、匿名类到Lambda表达式的演进过程,展示了代码如何逐步简化,特别是Lambda表达式如何极大提升了代码的可读性和简洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值