【Java 新特性】深入浅出 Java Lambda 表达式

Java 8 的 Lambda 表达式是一次编程方式的革命,让代码更加简洁、高效。本文将从基础语法入手,逐步深入讲解 Lambda 表达式的常用用法、进阶场景以及开发中的实战案。


一、 什么是 Lambda 表达式?

Lambda 表达式是一种匿名函数,旨在减少冗长的代码。其核心在于将功能作为参数传递。

简单来说,它让代码从这样的写法:

new Runnable() {@Overridepublic void run() {System.out.println("Hello, Lambda!");}
};

变得简洁如斯:

() -> System.out.println("Hello, Lambda!");

二、Lambda 表达式的基础语法

Lambda 表达式的基本语法如下:

(parameters) -> expression
(parameters) -> { statements; }

1. 无参数,无返回值

() -> System.out.println("Hello, World!");
  • ():无参数
  • ->:表示 Lambda 的分隔符
  • System.out.println("Hello, World!")单行表达式作为 Lambda 体。

2. 有参数,无返回值

接收一个参数 x,并打印。

(x) -> System.out.println(x);

3. 有多个参数,有返回值

返回两个参数的和,省略了 {}return

(x, y) -> x + y

4. 多行代码

如果 Lambda 体有多行代码,必须用 {} 包裹,并显式使用 return 返回值:

(x, y) -> {int sum = x + y;System.out.println("Sum: " + sum);return sum;
}

三、Lambda 表达式的常用场景

场景 1:代替匿名内部类

Lambda 表达式常用于简化匿名类的实现。

传统写法

Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Running...");}
};

Lambda 简化

Runnable runnable = () -> System.out.println("Running...");

场景 2:配合函数式接口

Lambda 表达式的核心是与 函数式接口 搭配使用。函数式接口是只包含一个抽象方法的接口,例如 java.util.function 包中的接口:

接口描述示例
Consumer<T>接收一个参数,无返回值x -> System.out.println(x)
Supplier<T>无参数,返回一个值() -> "Hello"
Function<T,R>接收一个参数,返回一个值x -> x.length()
Predicate<T>接收一个参数,返回布尔值x -> x > 0

示例:过滤集合

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().filter(x -> x % 2 == 0)  // 筛选偶数.forEach(System.out::println);

四、方法引用与构造器引用

Lambda 表达式的简化之道之一就是方法引用和构造器引用。

1. 方法引用

方法引用是 Lambda 表达式的一种简化形式,它通过 :: 运算符直接引用已有的方法。

类型示例说明
静态方法引用ClassName::staticMethodMath::max
实例方法引用instance::instanceMethodSystem.out::println
任意对象的方法引用ClassName::instanceMethodString::toUpperCase
构造器引用ClassName::newArrayList::new

示例:静态方法引用

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.forEach(System.out::println); // 等价于 x -> System.out.println(x)

示例:实例方法引用

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(String::toUpperCase); // 每个字符串转为大写

2. 构造器引用

通过构造器引用,可以动态创建对象实例。

示例:无参构造器

Supplier<List<String>> supplier = ArrayList::new;
List<String> list = supplier.get(); // 创建一个新的 ArrayList

示例:有参构造器

Function<String, Integer> converter = Integer::new;
Integer number = converter.apply("123"); // 将字符串 "123" 转为 Integer

五、开发中的实战案例

1. 集合排序

使用 Lambda 表达式快速排序:

List<String> names = Arrays.asList("Charlie", "Alice", "Bob");
names.sort((a, b) -> a.compareTo(b)); // 按字典序排序

进一步简化为方法引用:

names.sort(String::compareTo);

2. 线程池任务

Lambda 在多线程中非常适合,尤其是简化任务提交:

ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(() -> System.out.println("Task running in thread!"));

3. 文件操作

使用 Lambda 简化文件行处理:

Files.lines(Paths.get("data.txt")).filter(line -> line.startsWith("Error")) // 筛选以 "Error" 开头的行.forEach(System.out::println);

六、总结表格

概念语法示例应用场景
Lambda 基本语法(x, y) -> x + y替代匿名类、简化代码
Consumer 接口x -> System.out.println(x)消费一个值,例如打印、保存
Supplier 接口() -> "Hello"提供一个值,例如默认值
Function 接口x -> x.length()转换一个值,例如字符串长度
Predicate 接口x -> x > 0判断条件,例如筛选集合
静态方法引用Math::max引用已有静态方法
实例方法引用System.out::println引用已有对象的方法
构造器引用ArrayList::new动态创建实例,例如 Supplier

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

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

相关文章

STM32 SPI读取SD卡

七个响应类型&#xff1a; R1 Response (Normal Response): R1响应是最基本的响应&#xff0c;包含一个字节的状态位&#xff0c;用于指示命令是否成功执行。常用。最高位为0。最低位为1表示是空闲状态。其他位是各种错误提示。 R1b Response (Normal with Busy): 类似于R1&a…

深入浅出 Spring (二)| 依赖注入(DI)、自动装配

3. 依赖注入&#xff08;DI&#xff09; 3.1 概念 依赖注入&#xff08;Dependency Injection,DI&#xff09;。 依赖&#xff1a;bean对象的创建依赖于容器&#xff01;注入&#xff1a;bean对象中的所有属性&#xff0c;由容器来注入&#xff01; 创建子项目 spring04-DI…

线性代数期末复习 [基础篇]

关于第六点: AXB 在期末考试中一般A都是可逆的 我们可以先把A的逆求出来,X A − 1 B A^-1B A−1B,或者 (A,B) -> r (E, A − 1 B A^-1B A−1B) 如果A矩阵不可逆,转变为方程组求解问题,假设都是二维矩阵 A(x1,x2) (b1,b2) Ax1 b1,Ax2 b2 XAB 如果A可逆,直接XB A − 1 A^-…

V90伺服PN版组态配置<一>

1、添加PLC之后&#xff0c;继续博图中网络视图中添加新设备&#xff0c;添加伺服驱动器组态设备 2、SINAMICS V90 PN V1.0 3、修改驱动器的IP地址。 【注意】 在项目中提前做好项目规划&#xff0c;如PLC设备从192.168.0.1开始&#xff0c;顺序递增------个位数都是CPU设备…

深度学习笔记(12)——深度学习概论

深度学习概论 深度学习关系&#xff1a; 为什么机器人有一部分不在人工智能里面&#xff1a;机器人技术是一个跨学科的领域&#xff0c;它结合了机械工程、电子工程、计算机科学以及人工智能&#xff08;AI&#xff09;等多个领域的知识。 并不是所有的机器人都依赖于人工智能…

TCP-UDP调试工具推荐:Socket通信测试教程(附详细图解)

前言 在网络编程与应用开发中&#xff0c;调试始终是一项不可忽视的重要环节。尤其是在涉及TCP/IP、UDP等底层网络通信协议时&#xff0c;如何确保数据能够准确无误地在不同节点间传输&#xff0c;是许多开发者关注的核心问题。 调试的难点不仅在于定位连接建立、数据流控制及…

使用three.js 实现vr全景图展示,复制即可用

1.实现效果 2.代码 1.npm安装three.js npm install three 2.引入three.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls 3.初始化模型 init(val) {this.container document.querySelector(.container)// 初始…

1月第二讲:WxPython跨平台开发框架之图标选择界面

1、图标分类介绍 这里图标我们分为两类&#xff0c;一类是wxPython内置的图标资源&#xff0c;以wx.Art_开始。wx.ART_ 是 wxPython 提供的艺术资源&#xff08;Art Resource&#xff09;常量&#xff0c;用于在界面中快速访问通用的图标或位图资源。这些资源可以通过 wx.ArtP…

C语言优化技巧--达夫设备(Duff‘s Device)解析

1983年&#xff0c;一位程序员TomDuff&#xff08;曾在贝尔实验室和星球大战母公司卢卡斯影业就职过&#xff09;&#xff0c;在参与图形渲染的软件中尝试优化图像数据传输到帧缓冲区的过程中遇到了性能瓶颈&#xff0c;写下了一段奇怪的代码&#xff1a; void send( int * to…

[硬件] DELL BIOS 相关注意事项

前言 前段时间重装系统. DELL BIOS属实资料少, 又难用. 这里给出相关的注意事项, 并且配上图片. BIOS相关注意事项 进入BIOS ESC/F2/ F12. 都可以进入BIOS, 当进U盘的入Win PE系统时, 使用F12 效果更佳. 关闭安全模式 切换到Boot Configuration选项,将Secure Boot选项off选…

一个完美的自动化测试框架应该怎么写?

一、什么是自动化测试框架&#xff1f; 自动化测试框架是为自动化测试用例或者脚本提供执行环境而搭建的基础设施。自动化测试框架有助于有效地开发、执行和报告自动化测试用例。 优点&#xff1a; 代码复用 提高测试效率 更高的测试覆盖率 维护成本低 更早发现和记…

从0开始的docker镜像制作-ubuntu22.04

从0开始的docker镜像制作-ubuntu22.04 一、拉取基础ubuntu22.04镜像二、进入拉取的docker镜像中&#xff0c;下载自己需要的安装包三、安装需要的系统软件四、打包现有镜像为一个新的镜像五、推送打包的镜像到私有docker服务器1.编辑docker文件&#xff0c;使其允许http传输和对…

使用exe4j将jar转成exe、java打包exe

1、maven打包 需要配置以下插件&#xff0c;注意skip为false 插件配置中设置 <skip>true</skip> 时&#xff0c;实际上是告诉 Maven 在构建过程中跳过 spring-boot-maven-plugin 插件的执行。也就是说&#xff0c;Maven 在打包时不会将项目打包成可执行的 JAR 文…

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人&#xff0c;所幸终会天亮。明天就是新的开始&#xff0c;我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen&#xff0c;这是一个 Rust 库和 CLI…

Cherno C++学习笔记 P48 如何让vector运行的更快

这一篇文章当中我们会讲到有关于vector的使用优化问题&#xff0c;如何能够让vector运行得更快。C优化是一个非常非常复杂的问题&#xff0c;最重要的是要了解环境&#xff0c;要知道事情是如何发生的&#xff0c;以及我们应该怎么做。当然我们今天会做的事情其实只是触及表面。…

MyBatis执行一条sql语句的流程(源码解析)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程&#xff08;源码解析&#xff09; MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…

吊舱激光测距核心技术详解!

一、核心技术 吊舱激光测距的核心技术主要体现在激光发射与接收、信号处理与距离计算、以及数据校正与优化等方面。 激光发射与接收&#xff1a; 激光发射器&#xff1a;产生经过调制的激光束&#xff0c;该激光束具有特定的频率和波形。这些激光束被投射到目标物体上。 光…

SpringAI从入门到熟练

学习SpringAI的记录情况 文章目录 前言 因公司需要故而学习SpringAI文档&#xff0c;故将自己所见所想写成文章&#xff0c;供大佬们参考 主要是为什么这么写呢&#xff0c;为何不抽出来呢&#xff0c;还是希望可以用的时候更加方便一点&#xff0c;如果大家有需求可以自行去…

如何使用大语言模型进行事件抽取与关系抽取

诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取&#xff1f;2. 示例&#xff1a;使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取&#xff1f; 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…