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{@Overridepublic void lambda() {System.out.println("i like lambda2");}
}//    3. mainpublic static void main(String[] args) {
//        3. 创建接口对象  接口调用实现类ILike like = new Like();like.lambda();like = new Like2();like.lambda();//       4. 局部内部类class Like3 implements ILike {@Overridepublic void lambda() {System.out.println("i like lambda3");}}like = new Like3();like.lambda();//        5. 匿名内部类, 没有类的名称,必须借助接口或者父类like = new Like() {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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(){@Overridepublic 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表达式只能有一行代码的情况下才能简化成为一行, 如果有多行, 那就么就用代码块包裹.

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无代码无国界:我们正在走向软件安全的狂野西部吗?

我们使用的几乎所有东西都是基于代码构建的,从汽车到智能冰箱再到门铃。在企业中,无数的应用程序保持设备、工作流程和操作的运行。因此,当早期的无代码开发平台于 2010 年推出时,承诺为公民开发人员提供更易于访问的应用程序开发…

【Amplify_自己写的shadr遇到没有阴影的解决方案】

Amplify 自己写的shadr遇到没有阴影的解决方案 2020-01-21 16:04 本来我有个百试很灵的投射阴影脚本。 这次不灵光了!地形内建材质,这个不支持投射的阴影~~奇了怪了。 可以采用引用的方式UsePass加入阴影部分代码,具体操作如下&#xff1…

惠普打印机无线网络连接设置

休息一下,灌个水。这次没多少内容,具体步骤惠普官网上都有,唯一增加的是对安装过程中踩的坑做了一个说明。 一.打印机无线网络连接设置步骤 惠普打印机设置无线网络连接,共16个步骤。 1. 在电脑上打开任意浏览器&am…

设计模式-动态代理

目录 定义 代理模式的优缺点 优点 缺点 应用场景 静态代理 动态代理 相关资料 定义 代理模式(Proxy Pattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个…

【UE5.1 角色练习】01-使用小白人蓝图控制商城角色移动

目录 效果 步骤 一、导入资源 二、控制角色移动 三、更换角色移动动作 效果 步骤 一、导入资源 新建一个工程,然后在虚幻商城中将角色动画的相关资源加入工程,这里使用的是“动画初学者内容包”和“MCO Mocap Basics” 将我们要控制的角色添加进…

C# Winform+Halcon结合标准视觉工具

介绍 winform与halcon结合标准化工具实例 软件架构 软件架构说明 基于NET6 WINFORMHALCON 实现标准化视觉检测工具 集成相机通讯 集成PLC通讯 TCP等常见通讯 支持常见halcon算子 图形采集blob分析高精度匹配颜色提取找几何体二维码提取OCR识别等等 。。。 安装教程 …

PMR-440N7Q韩国施耐德三和相序继电器EOCR-PMR

韩国施耐德三和EOCR继电器PMR-440N7Q PMR-440-N 直流电动机保护器:DCL、DOCR-S/H 欠电流继电器:EUCR-3C 交流电压继电器:EOVR、EVR-PD、EVR-FD、EUVR 韩国三和EOCR电动机保护器:EOCR-SS、EOCR-SS1/SS2、EOCR-AR、EOCR-ST、EOCR-SP、EOCR-SP1/SP2、EOCR-SE、EOCR-SE2/SE PMR-44…

刘邦的创业团队是沛县人,朱元璋的则是凤阳;要创业,一个县人才就够了

当人们回顾刘邦和朱元璋的创业经历时,总是会感慨他们起于微末,都创下了偌大王朝,成就无上荣誉。 尤其是我们查阅史书时,发现这二人的崛起班底都是各自的家乡人,例如刘邦的班底就是沛县人,朱元璋的班底是凤…

新手去做抖音小店,多久稳定出单?出单的前提需要做好哪些工作?

大家好,我是电商小V 很多小伙伴经常去咨询的一个问题,那就是我是新手去做抖音小店多久才能够稳定出单呢? 根据我多年做店的经验来说,新手运营抖店的时候,只要自己的做店思路正确,执行力到位,一…

Vue3实战笔记(22)—路由Vue-Router 实战指南(路由传参)

文章目录 前言一、路由router-link二、路由传参1.query方式2.params方式3.props传参 总结 前言 vue-router 是 Vue.js 官方路由管理器。它和 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得易如反掌。 前面提到过简单的使用路由,直到上文使用404界面…

电脑常用的PDF阅读器-嗨动PDF编辑器!带你详细了解它

电脑常用的PDF阅读器-嗨动PDF编辑器!在数字化信息爆炸的时代,PDF格式的文件因其易于打印和保留原始格式等优点,成为了人们日常工作和学习的常用格式。而对于PDF文件的处理,一款功能强大、操作简便的PDF阅读器是必不可少的。今天&a…

红酒与美食的完善搭配艺术

在美食的世界里,红酒总是扮演着不可或缺的角色。它与美食的搭配,是一门深奥的艺术。云仓酒庄雷盛红酒,作为一款备受欢迎的红酒品牌,以其卓着的品质和丰富的口感,成为了红酒与美食搭配的典范。 雷盛红酒,源…