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.mzph.cn/bicheng/12010.shtml

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

相关文章

FloodFill算法---BFS

目录 一、前言 二、算法模板套路 2.1 创建所需的全局变量: 2.2 BFS模板: 2.3 细节处理: 三、例题练习 3.1 例题1:图像渲染 3.2 例题2:岛屿数量 3.3 例题3:岛屿的最大面积 3.4 例题4:被…

人工智能应用正在改变我们的生活

在这个AI蓬勃发展的时代,你如何使用人工智能?如果您认为还没有,请再想一想。人工智能已经为我们的许多日常活动提供了动力,尽管您可能还没有有意将其用作工具,但这种情况可能会在不久的将来发生变化。随着顶尖科技公司…

如何更换远程服务器的Python版本

目录 前言 正文 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University of Nottingham Ningbo China📫 You can reach me by url below:My Blo…

简单的mysql主从复制搭建

文章目录 准备工作用Docker安装MySQL主库配置【192.168.13.32】从库配置【192.168.13.108】小结 准备工作 用虚拟机提前准备两台服务器,并且在服务器中分别安装好MySQL,服务器的信息如下: 数据库IP主节点192.168.13.32从节点192.168.13.108…

IDEA终端环境配置

Idea如何配置终端; 第一步:找到我的电脑,右击——属性——高级系统设置——环境变量 先配置path: 在后面加入:C:\Program Files (x86)\Java\jdk1.7.0_75\bin(每个人放置jdk的位置不同。) 新建classpath:…

【MySQL数据库】初步认识数据库,实现基本操作

在信息爆炸的今天,数据无处不在,它们构成了互联网世界的基石。但数据本身若未经有效组织和管理,就如同散落在沙滩上的珍珠,难以发挥其真正的价值。这时,“数据库”这一概念便如同一根线,将这些珍珠串联起来…

【Redis】Redis 主从集群(一)

为了避免 Redis 的单点故障问题,可以搭建一个 Redis 集群,将数据备份到集群中的其它节点上。若一个 Redis 节点宕机,则由集群中的其它节点顶上 1.主从集群搭建 Redis 的主从集群是一个“一主多从”的读写分离集群。集群中的 Master 节点负责…

数字人解决方案——AniPortrait音频驱动的真实肖像动画合成

概述 在当今数字化时代,将静态图像和音频素材转化为动态、富有表现力的肖像动画,已经成为游戏、数字媒体、虚拟现实等多个领域的重要技术。然而,开发人员在创建既具有视觉吸引力又能保持时间一致性的高质量动画框架方面面临着巨大挑战。其中…

k8s endpoint

Endpoint Service 并不是和 pod 直接相连的,Endpoint 介于两者之间。Endpoint 资源就是暴露一个服务的 IP 地址和端口的列表。 虽然在 spec 服务中定义了 pod 选择器,但在重定向传入连接时不会直接使用它。选择器用于构建 IP 和端口列表,然…

优思学院:精益六西格玛如何影响企业文化?

精益六西格玛(Lean Six Sigma)是一种在优化生产过程、提高效率、减少浪费的管理方法论。其影响远不止于生产线或质量控制部门,实际上,精益六西格玛的实施可以深刻影响企业文化的各个层面,從而令企業獲得真正最大的成功…

【JavaScript超详细的学习笔记-下】JavaScrip超详细的学习笔记,共27部分,12多万字,学习js不错的选择,内容超详细

想要获取笔记的可以点击下面链接获取,或者私信我 ** JavaScript超详细的学习笔记,点击我获取 13,闭包 13-1 闭包 闭包是指有权访问另一个函数作用域中的变量的函数;其本质就是在一个函数内部创建另一个内部函数;并…

基于若依的开源网盘系统

简介 在线网盘系统,使用了DFA算法,实现了文件夹的创建与修改,多级目录,很正常的文件夹一样,支持所有文件上传,并按文件类型分类,支持文件删除,回收站管理,恢复与彻底删除…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势,其市场价值不仅体现在竞赛本身,还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目,包括竞速赛、技巧赛、航拍赛等。每个项目…

HR人才测评:自控能力与岗位胜任力素质测评

自控能力是什么? 自控能力可以解释为自我控制的能力,指一个人在应对人事物突发事件时,及时调整进行的自我控制的表现,它是实行自我支配的一种能力,在能进行自主支配时,一个人就成熟不少了,也可以…

优选算法——双指针1

双指针 常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。 对撞指针:⼀般⽤于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼 近…

MySQL-InnoDB数据存储结构

1、存储结构-页 索引结构提供了高效的索引方式,索引信息以及数据记录都保存在数据文件或索引文件中(本质存储在页结构中) 1.1、磁盘与内存交互的基本单位:页 在InnoDB中将数据划分为若干页,页的默认大小为&#xff…

webpack并行构建示例:

由于js的单线程特性,文件和任务时 要等待一个任务执行完成后执行下一个任务,但在实际开发中,很多任务是可以并行执行的(如同时处理多个不同js文件或同事压缩多张图片),一些loader和插件(thread-…

【数据结构】解密链表之旅(单链表篇)

前言 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累。我想让大家知道…

自制无感无刷电机驱动板

自制无感无刷电机驱动板 分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。 🧲测试转动效果 ✒目前市面上开源的有关无刷电机的项目数不胜数,其控制原理都大同小异,在没有领透其技术要领情况下&#x…

苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务 概念: 应用场景: 使用步骤: 实现订单超时和前一天派送中的订单的自动任务处理: Component Slf4j public class Mytask {Autowiredprivate OrderServiceimpl orderServiceimpl;/*** 处理订…