工作学习笔记(十一)Lambda 表达式

news/2024/11/18 23:58:41/文章来源:https://www.cnblogs.com/zjw111/p/18554014
  • 一、Lambda 表达式概述
    Lambda 表达式是 Java 中引入的一个重要特性,它提供了一种简洁的方式来表示可传递给方法或存储在变量中的代码块。本质上,它是一种匿名函数,让开发者可以用更紧凑、更函数式的风格来编写代码,尤其在处理集合操作、事件处理以及与函数式接口配合使用等场景中非常方便。

  • 二、Lambda 表达式的语法结构
    Lambda 表达式的基本语法格式如下:
    (parameters) -> expression 或者 (parameters) ->

  • 参数部分(parameters):
    如果没有参数,就写一对空括号 (),例如 () -> System.out.println("无参数的 Lambda")。
    若只有一个参数,参数的括号可以省略,像 param -> System.out.println(param)。
    当有多个参数时,用逗号隔开,如 (param1, param2) -> param1 + param2。
    箭头(->):这是 Lambda 表达式的标志性符号,用于分隔参数和表达式或语句块,表明参数如何映射到执行的代码逻辑。

  • 表达式或语句块(expression 或 {statements;}):
    如果表达式比较简单,能直接计算并返回一个值,就直接写表达式,例如 (a, b) -> a + b,它的返回值就是 a 与 b 相加的结果。
    要是逻辑复杂,需要多条语句来实现,那就用大括号括起来形成语句块,并且如果有返回值,要明确使用 return 语句,像 (int a, int b) -> { int sum = a + b; return sum; }。

  • 三、函数式接口与 Lambda 表达式
    Lambda 表达式主要用于实现函数式接口。函数式接口是指只包含一个抽象方法的接口(在 Java 8 中可以使用 @FunctionalInterface 注解来显式标记一个接口是函数式接口,不过即使不标记,只要符合只含一个抽象方法的规则,依然是函数式接口)。

例如,Java 内置的 java.util.function 包中有很多函数式接口:
Runnable 接口,它只有一个抽象方法 void run(),我们可以用 Lambda 表达式来创建 Runnable 的实例,像这样:

Runnable runnable = () -> System.out.println("使用 Lambda 实现的 Runnable");
Consumer 接口,其抽象方法为 void accept(T t),用于接收一个参数并执行相应操作但无返回值。例如:

Consumer<String> consumer = str -> System.out.println("消费的字符串是:" + str); consumer.accept("Hello");
Function<T, R> 接口,抽象方法是 R apply(T t),用于接收一个参数并返回一个结果。比如:

Function<Integer, Integer> function = num -> num * 2; int result = function.apply(5); System.out.println(result); // 输出 10

  • 四、Lambda 表达式在集合操作中的应用
    在 Java 中,对集合进行遍历、筛选、映射等操作时,Lambda 表达式结合一些新的方法(如 forEach、filter、map 等)能让代码更加简洁高效。
    以 List 集合为例:
    遍历集合:

List<String> list = Arrays.asList("apple", "banana", "cherry"); list.forEach(str -> System.out.println(str));
这里使用 forEach 方法结合 Lambda 表达式,很方便地遍历了列表中的每个元素并打印出来,相比于传统的 for 循环写法更加简洁直观。
筛选元素:
假设我们有一个 List 集合,想筛选出其中的偶数元素,可以利用 Stream API 和 Lambda 表达式的 filter 方法,代码如下:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); List<Integer> evenNumbers = numbers.stream() .filter(num -> num % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers);
这里先通过 stream 方法将集合转换为流,然后使用 filter 方法配合 Lambda 表达式定义筛选条件(判断是否为偶数),最后用 collect 方法将符合条件的元素收集起来形成新的列表。
映射元素:
比如想把一个 List 中的每个字符串都转换为大写形式,可以用 map 方法和 Lambda 表达式来实现:

List<String> words = Arrays.asList("hello", "world"); List<String> upperCaseWords = words.stream() .map(str -> str.toUpperCase()) .collect(Collectors.toList()); System.out.println(upperCaseWords);
map 方法结合 Lambda 表达式,按照定义的逻辑(这里是将字符串转换为大写)对集合中的每个元素进行转换,最终得到转换后的新集合。

  • 五、Lambda 表达式的优势
    代码简洁性:极大地减少了样板代码,让代码更加紧凑易读,尤其是在实现简单的接口方法逻辑时,避免了像匿名内部类那样冗长的写法。
    函数式编程风格支持:推动 Java 往函数式编程方向发展,方便进行诸如对集合的函数式操作等,使代码逻辑更贴近数学上的函数概念,便于理解和维护。
    提高开发效率:编写代码更加迅速,尤其在处理一些回调逻辑、事件处理器等场景中,能快速定义相应的行为逻辑。

  • 六、注意事项
    变量作用域:Lambda 表达式中访问外部变量时,外部变量必须是事实上的 final(即虽然不需要显式使用 final 关键字修饰,但在 Lambda 表达式内部不能对其重新赋值),例如:

int num = 10; Consumer<Integer> consumer = n -> { // num = 20; // 这样编译会报错,不能对外部变量重新赋值 System.out.println(num + n); }; consumer.accept(5);
异常处理:如果 Lambda 表达式中可能抛出受检异常(Checked Exception),需要在相应的函数式接口抽象方法声明中进行异常声明,或者在 Lambda 表达式内部进行合适的异常处理,不然编译会报错。

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

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

相关文章

DQL

1.使用select进行单表的查询 select*from 表名 会查询所有元素 select 列名,列名 from 表名 会查询所在列的元素select distinct 列名 from 表名; 会去除重复元素添加where字句来限定查询目标select*from student where name not in(‘元素’,元素); where 列名 not in(‘…

《Django 5 By Example》阅读笔记:p645-p650

《Django 5 By Example》学习第8天,p645-p650总结,总计6页。 一、技术总结 1.django-rest-framework (1)serializer p648, Serializer: Provides serialization for normal Python class instances。Serializer又细分为Serializer, ModelSerializer, HyperlinkedModelSeriali…

P1314 [NOIP2011 提高组] 聪明的质监员

题目 [NOIP2011 提高组] 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi 。检验矿产的流程是:给定m 个区间 [li,ri]; 选出一个参数 W; 对于一个区间 [li,ri]…

开源 - Ideal库 - 枚举扩展设计思路及实现难点(三)

分享枚举扩展设计思路,包括枚举值、名、描述、项、类型转换。实现难点包括枚举名称、描述转枚举处理,枚举值类型支持,高效返回键值对,识别有效位标志组合等。今天想和大家分享关于枚举扩展设计思路和在实现过程中遇到的难点。01、设计思路 设计思路说起来其实也很简单,就是…

安装新版pycharm 专业版 百分百成功

安装新版pycharm 专业版 百分百成功 创建时间:20241103 1. 下载插件 1.1 打开下面的网站 https://3.jetbra.in/1.2 选择能进去的网站 没使用鸡哥上网使用鸡哥上网1.3 进入的界面1.4 下载插件 查看这里支持的版本号2. 在官网下载对应的版本 2.1 官网的历史版本位置 我这里使用…

vercel无法导入github项目

背景 点击import后,浏览器打开了github的项目链接,而不是有关于项目部署的设置。根据网络上的说法,import后就会出现相关的配置页面,然而没有出现下面是预想的页面然而并没有出现。 解决 使用cli工具。 npm install -g vercel# 登录 vercel login # 部署 vercel回到官网,发…

福气满满-冲刺日志(第一天)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13305团队名称 福气满满团队成员学号-名字 052203132童潇剑,102201226陈潇健,102201235曾炜坤,102201234洪庆杨,102201224 陈博涵,18220031…

11.8 每日总结(继续学习redis)

今天依旧Redis,学习时长2小时。数据结构:

[极客大挑战 2019]Secret File

首页什么都没有,查看网页源码,发现有一个链接,提示found除去view-source访问,得到以下页面,点击secret直接查阅结束,没回显flag,依旧在卖关子。使用burp suite抓包获取返回的源码,找到注释中有个文件secr3t.php访问secr3t.php得到代码里说flag在flag.php里,直接访问fl…

CCTV 新闻节目 All In One

CCTV 新闻节目 All In One 世界周刊 《世界周刊》着力于信息整合,打破不同媒体间隔,从海量的信息碎片中捕捉世界发展的轨迹,从每周的国际事件中提炼出最有价值的内容。CCTV 新闻节目 All In One世界周刊《世界周刊》着力于信息整合,打破不同媒体间隔,从海量的信息碎片中捕…

厉害了,8.7w人打满分!如果我找 BUG 能像他一样厉害就好了!

你好呀,我是歪歪。 最近在 B 站上看到一个让我觉得“非常哇塞”视频的:https://www.bilibili.com/video/BV1y4421U72G/视频的播放量有接近 400w,在视频快结尾的地方,UP 主设置了一个打分的互动:8.7 万人参与,平均 10 分。这参与度和平均分,歪师傅作为在 B 站混迹多年的用…

JAVA反序列化学习-CommonsCollections2(基于ysoserial)

环境准备 JDK1.8(8u421)这里ysoserial,我以本地的JDK8版本为准、commons-collections4(4.0 以ysoserial给的版本为准)、javassist(3.12.1.GA) cc4.0、ClassPool <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4&…