【Java系列】深入解析 Lambda表达式二

Lambda 表达式在 Java 中引入于 Java 8,它使得函数式编程的实现变得更加容易和直观。接下来,我们将详细探讨 Java 中
Lambda 表达式的语法、用法以及相关特性。

1. Lambda 表达式的基本语法

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

(parameters) -> expression

或者

(parameters) -> { statements }

1.1 语法元素

  • 参数:可以是一个或多个参数,类型可以省略(编译器会进行类型推断)。
  • 箭头操作符 (->):将参数与表达式或语句块分开。
  • 表达式:可以是单个表达式或一个语句块。

1.2 示例

// 无参数
() -> System.out.println("Hello, World!");// 一个参数
x -> x * x;// 两个参数
(x, y) -> x + y;// 语句块
(x, y) -> {int sum = x + y;return sum;
};

2. 使用 Lambda 表达式

2.1 作为函数式接口的实现

Lambda 表达式通常用于实现函数式接口。函数式接口是只包含一个抽象方法的接口。

2.1.1 定义函数式接口
@FunctionalInterface
interface MyFunction {int apply(int x, int y);
}
2.1.2 使用 Lambda 表达式实现接口
MyFunction add = (x, y) -> x + y;
System.out.println(add.apply(2, 3));  // 输出 5

2.2 结合集合 API

Lambda 表达式与 Java 的集合框架结合使用,尤其是在 Stream API 中。

2.2.1 使用 forEach
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
2.2.2 使用 map
List<Integer> lengths = names.stream().map(name -> name.length()).collect(Collectors.toList());
System.out.println(lengths);  // 输出 [5, 3, 7]
2.2.3 使用 filter
List<String> filteredNames = names.stream().filter(name -> name.startsWith("A")).collect(Collectors.toList());
System.out.println(filteredNames);  // 输出 [Alice]

3. Lambda 表达式的特性

3.1 类型推断

在 Lambda 表达式中,参数的类型可以省略,编译器会根据上下文进行推断。

Function<Integer, Integer> square = x -> x * x;  // 类型自动推断

3.2 变量的作用域

Lambda 表达式可以访问其外部作用域中的变量,这种特性被称为闭包。

int factor = 2;
Function<Integer, Integer> multiplier = x -> x * factor;
System.out.println(multiplier.apply(5));  // 输出 10

3.3 不可变性

在 Lambda 表达式中,外部变量必须是“有效的最终变量”或“最终变量”,即在 Lambda 表达式创建后,这些变量的值不能被修改。

final int factor = 2;  // 必须是 final 或者是有效的最终变量
Function<Integer, Integer> multiplier = x -> x * factor;

4. 高级用法

4.1 组合 Lambda 表达式

可以通过方法引用或将多个 Lambda 表达式组合在一起,创建更复杂的操作。

4.1.1 使用方法引用
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);  // 方法引用替代 Lambda

4.2 自定义高阶函数

Lambda 表达式可以作为参数传递,从而实现更灵活的函数组合。

public static void process(List<String> list, Consumer<String> consumer) {for (String item : list) {consumer.accept(item);}
}List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
process(names, name -> System.out.println(name));  // 传递 Lambda 表达式

5. 性能考虑

尽管 Lambda 表达式非常灵活,但也有可能在高频调用时引入性能开销。建议在性能敏感的场景中,注意:

  • 尽量避免在循环内部创建 Lambda 表达式。
  • 使用方法引用替代 Lambda 表达式,减少对象创建。

6. 总结

Lambda 表达式是 Java 8 引入的重要特性,极大地提升了代码的可读性和简洁性。通过理解其语法、用法及特性,开发者能够更有效地利用 Lambda 表达式,提高开发效率。掌握 Lambda 表达式的使用,为编写现代 Java 代码打下坚实的基础。

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

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

相关文章

IDEA 关闭自动补全功能(最新版本)

文章目录 一、前言二、关闭自动补全三、最终效果 一、前言 在最新的 IDEA 中发布了自动补全功能&#xff0c;当你输入代码时&#xff0c;IDEA 会自动显示你可能想输入的代码&#xff0c;减少手动输入的工作量&#xff0c;它会根据上下文提供正确的选项&#xff0c;提高代码的准…

基于C#+SQL Server(CS界面)学生选课及成绩查询管理系统

学生选课及成绩查询管理系统的设计与开发 1、项目背景 学生选课及成绩查询系统是一个学校不可缺少的部分&#xff0c;传统的人工管理档案的方式存在着很多的缺点&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以开发一套综合教务系统管理软件很有必要&#xff…

对onlyoffice进行定制化开发

基于onlyoffice8.0源码&#xff0c;进行二次开发&#xff0c;可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加&#xff0c;去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…

华为全联接大会HUAWEI Connect 2024印象(四):上海大学的脑机接口演示

在HC上&#xff0c;除了华为自己的技术展示&#xff0c;也包括一些合作伙伴的展示。一个印象比较深的是上海大学的韶脑传感脑机接口。 上海大学现场准备了一个可以被脑机接口控制的电动轮椅供参观者现场体验。体验者需要先戴上一个头套&#xff0c;上面有各种传感器。据上海大…

STL队列

一、队列的介绍 队列是一种操作&#xff08;或者说运算&#xff09;受到限制的特殊线性表。其插入操作限定在表的一端进行&#xff0c;称为入队&#xff1b;其删除操作则限定在表的另一端进行&#xff0c;称为出队。插入一端称为队尾&#xff08;rear&#xff09;&#xff1b;删…

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享

配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …

❤Node11-登录人token信息接口

❤Node11-登录人token信息接口​ 上一章我们已经从登录部分拿到了用户的登录jwt返回的token信息&#xff0c;接下来我们就通过token来换取用户信息 这里我们可以将其理解为一种加密以及解密的思想来思考这个jwt和token的关系&#xff0c;token就是一个加密的字符串&#xff0c…

python 斑马打印模板

打印代码逻辑如下&#xff1b; 包括样式、表格 import win32printdef print_zpl_from_usb_printer(printer_name, zpl_content):# 打开打印机hPrinter win32print.OpenPrinter(printer_name)if hPrinter is None:print(f"Failed to open printer: {printer_name}")…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-&#xff08;1&#xff09;搭建项目环境 Spring Cloud Alibaba-&#xff08;2&#xff09;Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-&#xff08;3&#xff09;OpenFeign【服务调用】 Spring Cloud Alibaba-&#xff08;4&#xff09;Sen…

商标管理软件如何助力企业实现商标数字化管理?

商标作为企业的无形资产和品牌形象的核心&#xff0c;其管理方式的数字化升级已成为企业不可回避的课题。启服云商标管理软件凭借其强大的功能和灵活的解决方案&#xff0c;正帮助企业商标管理向数字化、智能化方向迈进&#xff0c;为企业品牌保护和市场拓展提供了强有力的支撑…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

QT菜单栏设计(二级菜单栏)

目的&#xff1a;创建一级菜单栏&#xff0c;添加对应选项&#xff0c;并向一级菜单栏中添加二级菜单栏选项。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindo…

科研绘图系列:R语言堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 微生物堆积图是一种数据可视化工具,通常用于展示微生物群落中不同物种的相对丰度。这种图表通过将每个样本中的微生物按照其分类学等级(如门、属等)进行分类,并以不同颜色的块状图表示,每个块的大小代表…

基于SSM+Android的签到系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题&#xff1a;Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

Debezium

Debezium 是一个开源的分布式平台&#xff0c;用于捕获数据库变化数据&#xff08;Change Data Capture, CDC&#xff09;。允许用户实时地从数据库中捕捉到数据的变化&#xff08;如插入、更新和删除操作&#xff09;&#xff0c;并将这些变化以结构化的数据流的形式提供给其他…

Java | Leetcode Java题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> levelOrder(Node root) {if (root null) {return new ArrayList<List<Integer>>();}List<List<Integer>> ans new ArrayList<List<Integer>&g…

语音识别控制(软件、硬件)

1. 环境 python版本&#xff1a;3.11.9 2. 完整代码 import sqlite3 import time import wave # 使用wave库可读、写wav类型的音频文件 from funasr import AutoModel import sounddevice as sd import numpy as np from modelscope import pipeline, Tasks from pypinyin …

centos7安装docker DokcerCompose

一, 安装docker 1.更新yum源 yum下载很慢&#xff0c;一直出现正在尝试其它镜像&#xff0c;更改yum地址为阿里云镜像即可 1&#xff09;下载了阿里云提供的CentOS 7的Yum源配置文件&#xff0c;并将其覆盖到系统中的 /etc/yum.repos.d/CentOS-Base.repo 文件。 wget -O /et…

简单计算器(python基础代码撰写)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…