Lambda 表达式

深入理解 Java 中的 Lambda 表达式

在 Java 编程的世界里,Lambda 表达式是一个强大且重要的特性。它为我们编写简洁、高效的代码提供了一种全新的方式,特别是在处理集合操作和实现接口的匿名类场景中。

什么是 Lambda 表达式?

Lambda 表达式本质上是一种匿名函数。它没有名称,但有参数列表、箭头符号(->)和函数体。例如:

(x, y) -> x + y;

在这个简单的 Lambda 表达式中,(x, y) 是参数列表,-> 是 Lambda 操作符,x + y 是函数体。这个表达式表示接受两个参数并返回它们的和。

Lambda 表达式的语法

1. 基本语法结构

  • 参数列表:可以包含零个或多个参数,参数类型可以显式声明,也可以由编译器自动推断。如果只有一个参数,并且其类型可以推断,括号可以省略。例如:x -> System.out.println(x)
  • 箭头符号-> 用于分隔参数列表和函数体。
  • 函数体:可以是一个表达式,也可以是一个语句块。如果是表达式,表达式的值就是 Lambda 表达式的返回值;如果是语句块,则需要使用 return 语句显式返回值(如果有返回值的话)。

2. 不同形式的 Lambda 表达式示例

无参数的 Lambda 表达式

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

有一个参数的 Lambda 表达式(省略括号)

x -> x * 2;

有多个参数的 Lambda 表达式

(x, y) -> {int sum = x + y;return sum;
};

Lambda 表达式在集合操作中的应用

1. 遍历集合

传统上,我们使用 for 循环或迭代器来遍历集合。但使用 Lambda 表达式结合 Java 8 的新特性,可以更加简洁地实现遍历。例如,遍历一个 List<String>

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(str -> System.out.println(str));

2. 集合的过滤操作

假设我们有一个包含整数的列表,想要筛选出其中的偶数。使用 Lambda 表达式和 Stream API 可以轻松实现:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());

3. 集合的映射操作

将一个集合中的元素通过某种转换生成一个新的集合。比如将一个字符串列表中的所有字符串转换为大写形式:

List<String> words = Arrays.asList("hello", "world");
List<String> upperCaseWords = words.stream().map(String::toUpperCase).collect(Collectors.toList());

Lambda 表达式实现接口

在 Java 中,我们经常需要创建接口的匿名类实现。Lambda 表达式为这种情况提供了更简洁的方式。例如,我们有一个接口 Runnable

Runnable runnable = () -> System.out.println("Running in a new thread!");
Thread thread = new Thread(runnable);
thread.start();

对于有参数的接口方法,比如一个自定义的接口 Calculator 有一个方法 int calculate(int a, int b)

interface Calculator {int calculate(int a, int b);
}Calculator addCalculator = (a, b) -> a + b;
Calculator subtractCalculator = (a, b) -> a - b;System.out.println(addCalculator.calculate(3, 5));
System.out.println(subtractCalculator.calculate(8, 3));

Lambda 表达式的优势

1. 代码简洁性

相比传统的匿名类实现方式,Lambda 表达式大大减少了代码量。它去除了大量的样板代码,使代码更加紧凑和易读。

2. 更好的表达能力

能够以更自然的方式表达行为,尤其是在处理集合操作和简单的接口实现场景中。它将重点放在了要执行的操作上,而不是实现的细节。

3. 支持函数式编程风格

Java 通过引入 Lambda 表达式和相关的函数式接口、Stream API 等特性,逐渐向函数式编程风格靠近。这种编程风格在处理数据转换、筛选和并行处理等方面具有很大的优势。

总之,Lambda 表达式是 Java 语言发展中的一个重要里程碑。它为 Java 开发者提供了一种更加简洁、高效和灵活的编程方式,无论是在处理集合数据还是实现简单的接口功能方面,都能让代码更加优雅和易于维护。掌握 Lambda 表达式对于提升 Java 编程能力和开发效率有着重要的意义。希望通过这篇博客,你对 Lambda 表达式有了更深入的理解和认识。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Web入门

Spring 官网&#xff1a;Spring | Home Spring是一个开源的Java企业级应用开发框架。Spring的主要目的是使Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;开发更容易&#xff0c;并且通过提供一系列丰富的库和接口来促进良好编程实践&#xff0c;是…

人工智能下半场,全球期待AI超级应用

人工智能&#xff08;AI&#xff09;这个概念&#xff0c;从1955年的达特茅斯会议开始&#xff0c;已经走过了很长的路。从最初的统计语言模型&#xff0c;到专家系统、神经网络&#xff0c;再到深度学习&#xff0c;AI技术不断进步。2019年到2022年&#xff0c;预训练模型大量…

西圣、猛玛、科唛领夹麦克风哪个牌子好?领夹麦精品实测大PK

无线领夹麦克风&#xff0c;这个在音频领域逐渐崭露头角的设备&#xff0c;已经深入到我们生活中的许多场景。从线上会议的清晰收音&#xff0c;到自媒体创作者户外拍摄时的便捷声音采集&#xff0c;它的重要性不言而喻。可是&#xff0c;市场上无线领夹麦克风的乱象令人担忧。…

哈工大华为出品|大模型「幻觉」,看这一篇就够了

大模型“幻觉”&#xff0c;终于有系统综述了&#xff01; 一口气49页&#xff0c;详细阐述了幻觉定义、分类、导致幻觉的原因&#xff0c;还有检测幻觉、减轻幻觉的方法。 这篇最新综述来自哈工大和华为&#xff0c;一po出就在网上火得不行&#xff1a; 具体来说&#xff0c…

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中&#xff0c;BootLoader 的设计是非常关键的部分&#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…

J.U.C - 深入解读重入锁和读写锁

文章目录 概述synchronized的缺陷1&#xff09;synchronized不能控制阻塞&#xff0c;不能灵活控制锁的释放。2&#xff09;在读多写少的场景中&#xff0c;效率低下。 独占锁ReentrantLock原理ReentrantLock概述AQS同步队列1. AQS实现原理2. 线程被唤醒时&#xff0c;AQS队列的…

异地双活容灾技术研究

摘要 随着技术快速发展&#xff0c;尤其是人工智能、大数据等新兴技术的应用&#xff0c;对数据安全提出了新的挑战&#xff0c;平台部署在机房云资源池&#xff0c;当云平台因人为错误原因出现基础设施故障&#xff0c;或自然灾害使得云平台的机房出现停电、断网等故障&#x…

从Facebook到Meta:公司转型背后的战略与意义

2021年&#xff0c;Facebook宣布更名为Meta&#xff0c;转型聚焦于“元宇宙”——这一虚拟世界的构建标志着公司从传统社交平台向更前沿的科技领域迈进。本文将探讨这一转型的背景、战略布局及其深远意义。 一、转型背景&#xff1a;应对市场和技术的挑战 自2004年成立以来&am…

前端在PC端实现支付思路流程

一.去支付 1.前端点击“去支付”按钮&#xff0c;请求订单详情接口&#xff0c;传递订单的id、订单号给后端和请求支付方式接口 2.后端返回支付信息和支付方式数据 二.弹出支付窗口 接收支付信息和支付方式数据后&#xff0c;前端弹出支付弹窗 三.确认支付 前端无论选择任何…

STM32 51单片机设计半导体制冷片温控设计

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 基于STM32与51单片机的半导体制冷片温控设计 前言 随着现代工业、医疗…

开源大模型技术路线及趋势

1. 三个维度 大模型研发力量 学术机构 大模型创业公司 科技大厂 旗舰开源模型的形态/模态 基础大模型 -> instruct大模型 -> 多模态&#xff08;VL大模型 -> 类gpt-4o大模型&#xff09; 时间线 23年上半年 23年下半年 24年 25年 2. 核心观察 学术机构及…

Vue学习笔记

Vue学习笔记 以下内容为黑马SpringbootVue3中的Vue3教程部分 Vue概述 什么是Vue&#xff1f; Vue 是一款用于构建用户界面的渐进式的JavaScript框架。&#xff08;官方:https://cn.vuejs.org/&#xff09; 快速入门 准备 准备html页面&#xff0c;并引入Vue模块&#xff08;官…

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中&#xff0c;使用MyBatis-Plus通过创建的实体类对数据库的操作过程中&#xff0c;通过实体创建数据库表是没有问题的&#xff0c;而在接口调用服务类操作数据库的时候&#xff0c;会出现报错。报错详情如下&#xff1a; 服务请求异…

Chrome DevTools Protocol 进阶: Page域

前言 本章开始我们将进一步学习 Chrome DevTools Protocol&#xff08;CDP&#xff09;&#xff0c;首先切入的内容是 CDP 中的域。 在 Chrome DevTools Protocol&#xff08;CDP&#xff09; 中&#xff0c;Page 域 是一个至关重要的部分&#xff0c;它负责控制浏览器页面的…

电动采光排烟大窗施工常见问题

电动采光排烟天窗施工常见问题可能涉及多个方面&#xff0c;包括施工前的准备、施工过程中的操作以及施工后的维护等。以下是对这些常见问题的归纳和分析。 一、施工前的准备问题 1、现场勘查不足&#xff0c;可能导致天窗尺寸、形状和材质不符合建筑设计要求&#xff1b; 2…

关于VUE NPM安装失败的问题

最近使用 npm install --registryhttps://registry.npmmirror.com 安装一个新项目的依赖&#xff0c;各种失败。 最后发现是package-lock里面有老的淘宝的域名&#xff0c;整体替换掉就行了

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…

解决Clion相对路径失效的问题

Clion相对路径失效的可能原因 工作目录不对相对路径错误 解决方法 设置工作目录 点击 工作文件 将工作路径置空 (或设置正确的工作路径) 之后便可完美解决 设置全局路径 这样即可解决 希望能帮助到你

香港电讯连续蝉联香港01「大湾区企业同创大奖」

香港电讯非常荣幸地连续第四年荣获「香港01大湾区企业同创大奖」殊荣&#xff0c;以表扬我们在大湾区业务所取得的卓越成绩&#xff0c;以及我们积极促进区内跨境业务方面的贡献。 面对企业拓展业务的迫切需求&#xff0c;香港电讯提供全面的跨境数码方案&#xff0c;包括SD-WA…

Vue3.js - 一文看懂Vuex

1. 前言 Vuex 是 Vue.js 的官方状态管理库&#xff0c;用于在 Vue 应用中管理组件之间共享的状态。Vuex 适用于中大型应用&#xff0c;它将组件的共享状态集中管理&#xff0c;可以避免组件间传递 props 或事件的复杂性。 2. 核心概念 我们可以将Vuex想象为一个大型的Vue&…