Lambda 表达式详解

Lambda
LAMBDA

⚪ λ 希腊字母表中排序第十一位的字母, 英语名称为Lambda

⚪ 避免匿名内部类定义过多

⚪ 其实质属于函数式编程的概念

⚪ 也可称为闭包

⚪ Lambda允许把一个函数作为方法的参数(函数作为参数传递进方法中)。

Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习

◻️ 为什么要使用Lambda表达式 

   ◽避免匿名内部类定义过多

   ◽可以使代码更加简洁紧凑

   ◽去掉了一堆没有意义的代码, 只留下核心的逻辑。

💬 也许你会说, 我看了Lambda表达式, 不但不觉得简洁, 反而觉得更乱了, 看不懂了. 那是因为我们还没有习惯, 用的多了, 看习惯了, 就好了。学习就是这样的一个过程

语法

lambda 表达式的语法格式如下:

(parameters) -> expression [表达式]
或
(parameters) -> statement [语句]
或
(parameters) -> { statements; }
a-> System.out.println("i like lambda-->"+a)

◻️ 理解Functional Interface (函数式接口) 是学习Java8 lambda表达式的关键所在。

 函数式接口定义:

   ◽任何接口, 如果只包含唯一一个抽象方法, 那么它就是一个函数式接口。

public interface Runnable {
   public abstract void run(); //抽象方法
}

   ◽对于函数式接口, 我们可以通过 Lambda表达式 来创建该接口的对象。

如果到这里某些小伙伴还是听不懂的话, 没关系, 我们上代码推动着你讲解一下你就懂了:

Lambda表达式推导

1. 首先需要定义一个函数式接口

2. 实现接口的方法 → 一步一步简化方式实现

  •      第一个实现方法  :创建实现类, 实现
  •      第二个实现方法  :静态内部类, 实现
  •      第三个实现方法  :局部内部类, 实现
  •      第四个实现方法  :匿名内部类, 实现
  •      第五个实现方法  :Lambda表达式, 实现

3. 创建接口对象  接口调用实现类

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  10:52
 * @Description: TODO: 推导 Lambda表达式
 * @Version: 1.0
 */
public class TestLambda {
//    3. 静态内部类
    static class Like2 implements ILike{
    @Override
    public void lambda() {
        System.out.println("i like lambda2");
    }
}

//    3. main
    public static void main(String[] args) {
//        3. 创建接口对象  接口调用实现类
        ILike like = new Like();
        like.lambda();

        like = new Like2();
        like.lambda();


//       4. 局部内部类

        class Like3 implements ILike {
            @Override
            public void lambda() {
                System.out.println("i like lambda3");
            }
        }

        like = new Like3();
        like.lambda();

//        5. 匿名内部类, 没有类的名称,必须借助接口或者父类
        like = new Like() {
            @Override
            public void lambda() {
                System.out.println("i like lambda4");
            }
        };
        like.lambda();

//        6. 用Lambda简化 Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习
        like = ()-> {
            System.out.println("i like lambda5");
        };
        like.lambda();
    }
}

//1. 首先需要定义一个函数式接口
interface ILike {
    void lambda();
}

//2. 实现类, 实现lambda方法
class Like implements ILike {
    @Override
    public void lambda() {
        System.out.println("i like lambda");
    }
}

如果你还是不理解那我们再来写一个例子

 我们可以看到我们以上代码定义的函数式接口是没有参数的, 那我们来写一个不同的例子, 带参数的函数式接口.

这次我们一个方式一个方式的写, 看着不会太乱, 更好理解

Lambda表达式推导详解

这里我们定义了一个int类型的参数

1. 定义一个带参数的函数接口 

2. 实现接口方法

3. 创建接口对象  接口调用实现类

4. 传递参数

  • 第一个实现方法  :创建实现类, 实现

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

    public static void main(String[] args) {
//    创建接口对象
        ILove love = new Love();
//    传递参数
        love.love(2);
    }
}

// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

//2. 实现类
class Love implements ILove {
    @Override
    public void love(int a) {
        System.out.println("i love you--->" + a);
    }
}

  •      第二个实现方法  :静态内部类, 实现 

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

    //2. 静态实现类
    static class Love implements ILove {
        @Override
        public void love(int a) {
            System.out.println("i love you--->" + a);
        }

        public static void main(String[] args) {
//    实现love接口
            ILove love = new Love();
//    传递参数
            love.love(2);
        }
    }
}


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

  •      第三个实现方法  :局部内部类, 实现

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

        public static void main(String[] args) {
            //2. 局部内部类
             class Love implements ILove {
                 @Override
                 public void love(int a) {
                     System.out.println("i love you--->" + a);
                 }
             }
//    实现love接口
            ILove love = new Love();
//    传递参数
            love.love(2);
        }
    }


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

     

  • 第四个实现方法  :匿名内部类, 实现

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

        public static void main(String[] args) {
//    实现love接口
//          匿名内部类
            ILove love = new ILove(){
                @Override
                public void love(int a) {

                }
            };
//    传递参数
            love.love(2);
        }
    }


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

匿名内部实现类推导再简化, 就是我们的Lambda表达式.

  •       第五个实现方法  :Lambda表达式, 实现

如下图:

基于匿名内部类代码小编圈起来的代码都不用要了直接删掉!

  • 只留下我们的参数和主体  就是我们的lambda表达式了

参数: int a;

主体: System.out.println()

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

        public static void main(String[] args) {
//    实现love接口
//          lambda表达式实现
            ILove love = (int a)-> {
                System.out.println("i love lambda表达式");
            };
//    传递参数
            love.love(2);
        }
    }


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

那有些小伙伴就要问了:

💬 :既然可以简化这么多, 我们还能不能对它再简化呢?

👩‍💻:没问题

而且小编给大家扩充一下, Lambda表达式可以实现3种简化.但是也有条件的

简化 Lambda表达式

  • 简化方式一:

1. 简化掉参数类型

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

        public static void main(String[] args) {
//    实现love接口
            ILove love=null;
//          lambda表达式实现
            love = (int a)-> {
                System.out.println("i love lambda表达式");
            };

//            Lambda表达式简化 1, 参数类型
            love = (a)-> {
                System.out.println("i love lambda表达式");
            };

//    传递参数
            love.love(2);
        }
    }


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

  •  简化方式二:

2. 简化掉参数类型+括号

前提:

只有一个参数的情况下才可以去掉括号, 多个参数会报错. 加上括号即可

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

        public static void main(String[] args) {
//    实现love接口
            ILove love=null;
//          lambda表达式实现
            love = (int a)-> {
                System.out.println("i love lambda表达式");
            };

//            Lambda表达式简化 1, 参数类型
            love = (a)-> {
                System.out.println("i love lambda表达式");
            };

//            Lambda表达式简化 2, 简化括号
            love = a-> {
                System.out.println("i love lambda表达式");
            };

//    传递参数
            love.love(2);
        }
    }


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

  •   简化方式三:

2. 简化掉参数类型+括号+花括号

前提:

只有一行代码的情况下

多个参数不能使用, 会报错 多个参数需要加上括号

package cn.lambda;

/**
 * @BelongsProject: staticthread
 * @BelongsPackage: cn.lambda
 * @Author: Jean_z
 * @CreateTime: 2024-05-14  12:11
 * @Description: TODO
 * @Version: 1.0
 */
public class TestLambda2 {

        public static void main(String[] args) {
//    实现love接口
            ILove love=null;
//          lambda表达式实现
            love = (int a)-> {
                System.out.println("i love lambda表达式");
            };

//            Lambda表达式简化 1, 参数类型
            love = (a)-> {
                System.out.println("i love lambda表达式");
            };

//            Lambda表达式简化 2, 简化括号
            love = a-> {
                System.out.println("i love lambda表达式");
            };

//            Lambda表达式简化 3, 简化花括号
            love = a-> System.out.println("i love lambda表达式" + a);

//    传递参数
            love.love(2);
        }
    }


// 1. 定义一个带参数的函数式接口
interface ILove {
    void love(int a);  //定义一个int类型的参数
}

总结:

lambda表达式只能有一行代码的情况下才能简化成为一行, 如果有多行, 那就么就用代码块包裹.

前提是接口为函数时接口.

多个参数也可以去掉参数类型, 要去掉就全去掉, 必须加括号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/629238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据可视化-05】:Plotly数据可视化宝典

一、引言 数据可视化是机器学习流程中不可或缺的一部分。通过图形和图表展示数据,我们可以更直观地理解数据的分布、趋势和关联,从而更有效地进行数据分析、特征工程和模型评估。Plotly是一个功能强大且灵活的数据可视化库,它提供了丰富的图表…

人物介绍模板 PSD 源文件免费获取

免费获取 下载链接在最后! 下载链接在最后! 下载链接在最后! 下载链接在最后! 下载链接在最后! 链接:https://pan.baidu.com/s/1sq3e6djMdZt76Sh_uqVxWg 提取码:naun

相约蓉城 | 全视通邀您参加 CHCC 2024第25届全国医院建设大会

第25届全国医院建设大会暨国际医院建设、装备及管理展览会(CHCC2024),将于5月17日-19日在成都中国西部国际博览城盛大启幕。 全视通将携智慧病房、智慧门诊、智慧手术室、智慧后勤、智慧康养等产品方案亮相11号厅K05展位,期待与您…

Math.Round()函数说明

Math.Round()并不是严格意义上的是四舍五入函数。它默认的执行的是“银行家舍入”算法,即四舍六入五取偶。概括为:四舍六入五考虑、五后非零就进一,五后皆零看奇偶,五前为偶应舍去、五前为奇要进一。 当为5时,取离着最…

TypeScript学习日志-第二十四天(webpack构建ts+vue3)

webpack构建tsvue3 一、构建项目目录 如图: shim.d.ts 这个文件用于让ts识别.vue后缀的 后续会说 并且给 tsconfig.json 增加配置项 "include": ["src/**/*"] 二、基础构建 安装依赖 安装如下依赖: npm install webpack -D …

python实现贪吃蛇游戏,python贪吃蛇

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 贪吃蛇游戏是一款经典的休闲益智类游戏,以下是关于该游戏的详细介绍: 游戏类型与平台:

JAVA云his医院管理系统源码 SaaS模式+融合B/S版电子病历 基于云计算技术开发的云his医院管理系统

JAVA云his医院管理系统源码 SaaS模式融合B/S版电子病历 基于云计算技术开发的云his医院管理系统 定义 美国著名教授Morris.Collen于1988年曾著文为医院信息系统下了如下定义:利用电子计算机和通讯设备,为医院所属各部门提供病人诊疗信息和行政管理信息…

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译:在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…

STM32学习-1 新建工程

教学资料来自【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p5&share_sourcecopy_web&vd_sourcec6cfedd1c739ca8502f041514e158616 在keil中,每个代码最后一行必须是空的,不然运行会报错 配置库函…

Failed to start tomcat.service: Unit is not loaded properly: Bad message 如何解决?

错误 “Failed to start tomcat.service: Unit is not loaded properly: Bad message” 通常意味着的 tomcat.service systemd 配置文件存在语法错误或配置不正确。为了解决这个问题,一步步检查和修正这个服务文件。 1. 检查 tomcat.service 文件 首先&#xff0c…

免费泛域名证书申请

通配符证书是一种 SSL/TLS 证书,可用于保护多个域(主机),由域名字段中的通配符 (*) 指示。 如果您有很多需要保护的域或子域,这会很有帮助,因为它可以节省您的时间和金钱。 本文将讨论通配符证书、它们的工…

【文献阅读】李井林等2021ESG促企业绩效的机制研究——基于企业创新的视角

ESG促进企业绩效的机制 摘要 0.引言与文献综述 1.理论分析与研究假设 1.1企业ESG表现与企业绩效 假设1a:企业的环境表现对企业绩效存在正向影响效应。 假设1b:企业的社会表现对企业绩效存在正向影响效应。 假设1c:企业的公司治理表现对企业…

开放式耳机哪款具有高性价比?5款高分开放式耳机倾力推荐

作为多年的耳机发烧友,强烈给你们安利开放式耳机,真的是舒适耐用,性价比高。开放式耳机以其独特的不入耳设计,给用户带来了最舒适的佩戴感受。如果小白还不知道怎么选择高性价比的开放式耳机那就看看我的总结吧!下面就…

Fast-Poisson-Image-Editing代码介绍(二)

目录 2.fpei文件下 2.6 number_solver.py 2.7 process.py 2.8 taichi_solver.py 3. 算法总结 4. 代码运行 4.1 测试 4.2 基于GUI后端自定义框输出编辑图像结果 4.2.1 下载open-cv 4.2.2 输入命令 4.2.3 自定义框 4.2.4 按ESC退出 接续Fast-Poisson-Image-Editing代码…

MYSQL和JAVA中将中文汉字按照拼音首字母排序

一、MYSQL将中文汉字按照拼音首字母排序 数据库使用的字符编码是utf8_general_ci,如下 ORDER BY CONVERT(表名.字段名 USING gbk) COLLATE gbk_chinese_ci ASC;若是表查询,CONVERT中可以不添加表名。 查询结果如下: 二、JAVA中将中文汉字…

【Qt】widget圆角,styleSheet

仅配置widget,不设置其子组件。 #widget{background-color: rgba(255, 255, 255, 100); border-top-left-radius: 20; border-top-right-radius: 20; border-bottom-left-radius: 20; border-bottom-right-radius: 20;}

Vue3.0 一些总结 【持续更新】

1. reactive 只适用于对象 (包括数组和内置类型,如 Map 和 Set,它不支持如 string、number 或 boolean 这样的原始类型) import { reactive } from vueconst counter reactive({count: 0 })console.log(counter.count) // 0 counter.count注意&#xf…

msvcp140_codecvt_ids.dll找不到要如何处理?简单的修复方法分享

在使用Windows操作系统时,用户可能会遇到“无法找到msvcp140_codecvt_ids.dll”这一错误信息。该提示通常发生在启动某些应用程序时,提示失去了关键的动态链接库文件(DLL)依赖。此DLL文件属于Microsoft Visual C Redistributable软…

#Docker | Ngrok# 使用Ngrok和Docker进行内网穿透

一、注册 Ngrok官网注册,可以使用gmail或者outlook邮箱, 正常填写后你会收到一封电子邮件,点击邮件中链接即注册成功 二、获取密钥 登录,点击Your Authtoken,最上面copy左边就是你得密钥 三、使用内网穿透启动docker…

Xed编辑器开发第一期:使用Rust从0到1写一个文本编辑器

这是一个使用Rust实现的轻量化文本编辑器。学过Rust的都知道,Rust 从入门到实践中间还隔着好几个Go语言的难度,因此,如果你也正在学习Rust,那么恭喜你,这个项目被你捡到了。本项目内容较多,大概会分三期左右陆续发布&a…