Java中Lambda表达式的进化之路详解

本文通过示例大家给大家介绍了Java中Lambda表达式的进化之路,感兴趣的的朋友一起看看吧,希望能够给你带来帮助

目录
  • Lambda表达式的进化之路
    • 为什么要使用Lambda表达式
    • Lambda表达式的注意点
    • 下面是Lambda表达式的实现过程
      • 1.最开始使用的是定义外部实现类来完成接口
      • 2.开始使用静态内部类来实现
      • 3.使用局部内部类使用
      • 4.使用匿名内部类实现接口
      • 5..最后使用Lambda表达式实现函数式接口
  • 总结

    Lambda表达式的进化之路

    为什么要使用Lambda表达式

    • 可以简洁代码,提高代码的可读性
    • 可以避免匿名内部类定义过多导致逻辑紊乱
    • 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实现,后面变为定义内部静态类,然后变为用局部内部类实现,再后面变成了定义匿名内部类来实现,最后的最后,为了代码的更加简洁,推出了Lambda表达式,最终实现了用一行代码完成之前多行代码的效果

    Lambda表达式的注意点

    • Lambda表达式实际上属于是函数式编程的概念,所以在使用的时候要知道是否属于函数式编程
    • Lambda表达式的实现依赖于接口和父类,所以必须有两者之一才能实现Lam表达式
    • Lambda表达式实现的接口中要求只有一个抽象方法,如果有多个抽象方法就无法使用Lambda表达式来编程
    • Lambda表达式即适用于无参方法,也适用于含参方法
    • Lambda表达式最早在JDK 8中开始出现,所以只有 JDK 8 以后的版本才支持

    下面是Lambda表达式的实现过程

    1.最开始使用的是定义外部实现类来完成接口

    public class tt1 {
        public static void main(String[] args) {
            //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
            //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
            lover l1 = new lover();
            l1.love();
        }
    }
    //定义接口
    interface ILove {
        void love();
    }
    //外部实现类
    class lover implements ILove{
        @Override
        public void love() {
            System.out.println("I love you my lover ---> 1");
        }
    }
    

    //输出为:I love you lover ---> 1

    2.开始使用静态内部类来实现

    public class tt1 {
        //静态内部类
        static class lover2 implements ILove{
            @Override
            public void love() {
                System.out.println("I love you my lover ---> 2");
            }
        }
        public static void main(String[] args) {
            //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
            //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
            ILove l1 = new lover1();
            l1.love();
            //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
            ILove l2 = new lover2();
            l2.love();
        }
    }
    //定义一个函数式接口
    interface ILove {
        void love();
    }
    //外部实现类
    class lover1 implements ILove{
        @Override
        public void love() {
            System.out.println("I love you my lover ---> 1");
        }
    }
    

    //输出为:I love you my lover ---> 1
    // I love you my lover ---> 2

    3.使用局部内部类使用

    public class tt1 {
        //静态内部类
        static class lover2 implements ILove{
            @Override
            public void love() {
                System.out.println("I love you my lover ---> 2");
            }
        }
        public static void main(String[] args) {
            //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
            //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
            ILove l1 = new lover1();
            l1.love();
            //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
            ILove l2 = new lover2();
            l2.love();
            //局部内部类
            class lover3 implements ILove{
                @Override
                public void love() {
                    System.out.println("I love you my lover ---> 3");
                }
            }
            ILove l3 = new lover3();
            l3.love();
        }
    }
    //定义一个函数式接口
    interface ILove {
        void love();
    }
    //外部实现类
    class lover1 implements ILove{
        @Override
        public void love() {
            System.out.println("I love you my lover ---> 1");
        }
    }
    

    //输出为:I love you my lover ---> 1
    // I love you my lover ---> 2
    // I love you my lover ---> 3

    4.使用匿名内部类实现接口

    public class tt1 {
        //静态内部类
        static class lover2 implements ILove{
            @Override
            public void love() {
                System.out.println("I love you my lover ---> 2");
            }
        }
        public static void main(String[] args) {
            //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
            //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
            ILove l1 = new lover1();
            l1.love();
            //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
            ILove l2 = new lover2();
            l2.love();
            //局部内部类
            class lover3 implements ILove{
                @Override
                public void love() {
                    System.out.println("I love you my lover ---> 3");
                }
            }
            ILove l3 = new lover3();
            l3.love();
            //使用内部匿名类
            ILove l4 = new ILove() {
                @Override
                public void love() {
                    System.out.println("I love you my lover ---> 4");
                }
            };
        }
    }
    //定义一个函数式接口
    interface ILove {
        void love();
    }
    //外部实现类
    class lover1 implements ILove{
        @Override
        public void love() {
            System.out.println("I love you my lover ---> 1");
        }
    }
    

    //输出为:I love you my lover ---> 1
    // I love you my lover ---> 2
    // I love you my lover ---> 3
    // I love you my lover ---> 4

    5..最后使用Lambda表达式实现函数式接口

    public class tt1 {
        //静态内部类
        static class lover2 implements ILove{
            @Override
            public void love() {
                System.out.println("I love you my lover ---> 2");
            }
        }
        public static void main(String[] args) {
            //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
            //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
            ILove l1 = new lover1();
            l1.love();
            //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
            ILove l2 = new lover2();
            l2.love();
            //局部内部类
            class lover3 implements ILove{
                @Override
                public void love() {
                    System.out.println("I love you my lover ---> 3");
                }
            }
            ILove l3 = new lover3();
            l3.love();
            //使用内部匿名类
            ILove l4 = new ILove() {
                @Override
                public void love() {
                    System.out.println("I love you my lover ---> 4");
                }
            };
            l4.love();
            //使用Lambda表达式实现接口
            ILove l5 = () ->{
                System.out.println("I love you my lover ---> 5");
            };
            l5.love();
        }
    }
    //定义一个函数式接口
    interface ILove {
        void love();
    }
    //外部实现类
    class lover1 implements ILove{
        @Override
        public void love() {
            System.out.println("I love you my lover ---> 1");
        }
    }
    

    //输出为:
    I love you my lover ---> 1
    I love you my lover ---> 2
    I love you my lover ---> 3
    I love you my lover ---> 4
    I love you my lover ---> 5

    关于Lambda表达式的更加极致的简化(针对有参数的Lambda表达书)

    • 简化数据类型 在Lambda表达式中可以将参数的数据类型省略,只留下一个数据名称。比较特殊的是如果有多个参数,省略的时候应该将所有参数的数据类型都省略,不然就全部不省略,而且需要用括号将参数包含在内。
    • 省略括号 参照上一条,只有一个参数要求的时候才可以省略括号省略花括号
    • 在Lambda表达式中,只有当输出语句或者代码只有一行的时候可以省略花括号。假如有多条执行代码,还是需要用花括号将代码包含在内

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注北冥有鱼的更多内容!

    您可能感兴趣的文章:

    • 关于Java 中的 Lambda 表达式
    • 深入浅出理解Java Lambda表达式之四大核心函数式的用法与范例
    • Java 进阶使用 Lambda 表达式实现超强的排序功能
    • java Lambda表达式的使用心得
    • Java中Lambda表达式的使用详解
    • Java Lambda 表达式源码解析
    • Java8新特性:lambda表达式总结
    • Java中Lambda表达式用法介绍

    相关推荐:

    AWS Lambda 部署时 Python 包缺失的解决方案

    使用AWSSAM部署Lambda函数时,若通过samdeploy--template-file显式指定模板文件,会导致依赖包(如requirements.txt中声明的pytest)未被正确打包上传,从而在运行时抛出ModuleNotFoundError。根本原因在于该参数绕过了SAM的自动构建产物...

    GraalVM 中 Java Map 与 Python 的双向互操作实践

    本文详解如何在GraalVMPolyglot环境中安全、高效地将JavaMap传递给Python脚本,调用其方法获取值,并将处理结果(如新Map)返回Java,重点解决AttributeError:foreignobjecthasnoattribute'items'等常见互操作异常。 本文详解如何在...

    Python lambda为什么受限_lambda设计初衷

    python的lambda表达式仅支持单个表达式,根本原因在于其设计初衷是为简洁、一次性的小型操作提供语法糖,而非替代普通函数;它不允许语句、无函数名、无文档字符串、不支持多行逻辑,体现“清晰胜于紧凑”的哲学。 Python的lambda表达式受限,根本原因在于它的设计初衷就不是为了替代普通函数,而...

    Python lambda函数限制_匿名函数机制

    python的lambda函数是单表达式匿名函数,仅支持一个表达式(如三元操作符),禁止语句(return/if/赋值等),无函数名、不可注解类型或加装饰器,调试困难,适用于简单一次性场景。 Python的lambda函数本质是**单表达式匿名函数**,它不是语法糖,而是有明确设计边界和运行约束的机...

    在 AWS Lambda 中复用数据库连接的最佳实践

    本文详解如何通过初始化阶段复用数据库连接,显著降低lambda执行时长与成本,并规避连接失效风险。核心在于将pymysql.connect()移至lambda_handler外部,在冷启动时建立连接,热启动时直接复用。 本文详解如何通过初始化阶段复用数据库连接,显著降低lambda执行时长与成本,并...

    Python lambda 表达式使用场景总结

    lambda适用于短小、一次性、无需复用的函数,主要作为高阶函数参数或轻量回调;避免多表达式、复杂逻辑、重复使用及需文档字符串的场景。 Python的lambda表达式适合写**短小、一次性、无需复用**的函数逻辑,核心价值是“简洁地内联定义函数”,不是为了替代普通函数。 作为高阶函数的参数(最常见...

    如何精简 SciPy 以适配 AWS Lambda(50MB 限制)

    本文详解如何在不使用容器镜像的前提下,通过裁剪SciPy和NumPy的二进制依赖,构建轻量级Lambda层,使其满足50MB压缩包限制,并解决常见的numpy.core._multiarray_umath导入错误。 本文详解如何在不使用容器镜像的前提下,通过裁剪scipy和numpy的二进制依赖,构...