Java-Lambda 表达式

Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简洁的方式来表示匿名函数。Lambda 表达式主要用于简化函数式接口的实现,使代码更加简洁和易读。以下是关于 Lambda 表达式的详细阐述:


1. Lambda 表达式的基本语法

Lambda 表达式的语法如下:

(parameter_list) -> { 代码块 }
  • parameter_list:参数列表,可以包含零个或多个参数,参数类型可以省略(由编译器自动推断)。
  • ->:Lambda 操作符,将参数列表与 Lambda 主体分隔开。
  • 代码块:Lambda 主体,包含实现函数式接口的代码。如果只有一行代码,可以省略 {}return 语句。
示例:
// 无参数
() -> System.out.println("Hello, World!");// 单个参数
(x) -> x * x;// 多个参数
(x, y) -> x + y;// 带代码块
(x, y) -> {int sum = x + y;return sum;
};

2. 函数式接口

Lambda 表达式的核心是函数式接口(Functional Interface)。函数式接口是指 仅包含一个抽象方法 的接口。Java 提供了 @FunctionalInterface 注解来标记函数式接口。

常见的函数式接口:
  • Runnablevoid run()
  • Consumer<T>void accept(T t)
  • Supplier<T>T get()
  • Function<T, R>R apply(T t)
  • Predicate<T>boolean test(T t)
示例:
@FunctionalInterface
interface MyInterface {void doSomething();
}// 使用 Lambda 表达式实现函数式接口
MyInterface myLambda = () -> System.out.println("Doing something");
myLambda.doSomething();

好好体会一下,lambda式是一个函数,他赋值给一个接口变量,那么这个接口一定要有一个抽象方法去实现,正好把lambda的这个函数赋值给这个未被重写的抽象类;而且这个接口一定只能有一个未实现方法,为什么呢,因为如果有多个,谁也分不清楚给哪个方法;有点意思!


3. Lambda 表达式的使用场景

(1) 简化匿名内部类

Lambda 表达式可以替代匿名内部类,使代码更简洁。

// 传统匿名内部类
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("Hello, World!");}
};// 使用 Lambda 表达式
Runnable r2 = () -> System.out.println("Hello, World!");

注意:以上代码中Runnable 就只是一个普通的函数式接口,只是起到举例子的效果,可以替换成自定义函数式接口

(2) 遍历集合

Lambda 表达式结合 forEach() 方法可以简化集合的遍历操作。

List<String> list = Arrays.asList("Apple", "Banana", "Orange");// 传统遍历
for (String s : list) {System.out.println(s);
}// 使用 Lambda 表达式
list.forEach(s -> System.out.println(s));
(3) 作为方法参数

Lambda 表达式可以作为方法参数传递,特别适合用于需要回调函数的场景。

public static void processList(List<String> list, Consumer<String> consumer) {for (String s : list) {consumer.accept(s);}
}// 调用方法
processList(list, s -> System.out.println(s));
(4) 结合 Stream API

Lambda 表达式与 Stream API 结合,可以实现强大的数据处理功能,如过滤、映射、排序等。

List<String> fruits = Arrays.asList("Apple", "Banana", "Orange", "Mango");// 过滤长度大于 5 的字符串
List<String> filtered = fruits.stream().filter(s -> s.length() > 5).collect(Collectors.toList());// 将字符串转换为大写
List<String> upperCase = fruits.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());

4. Lambda 表达式的变量作用域

Lambda 表达式可以访问外部的局部变量、实例变量和静态变量,但有如下限制:

  1. 局部变量:Lambda 表达式访问的局部变量必须是 final 或实际上是 final 的(即不可变)。
  2. 实例变量和静态变量:Lambda 表达式可以访问并修改实例变量和静态变量。
示例:
int num = 10; // 局部变量
Runnable r = () -> System.out.println(num); // num 必须是 final 或 effectively final// 错误示例
int num2 = 20;
num2 = 30; // 修改 num2
Runnable r2 = () -> System.out.println(num2); // 编译错误:num2 必须是 final

5. 方法引用

方法引用是 Lambda 表达式的一种简化形式,用于直接引用已有的方法。方法引用的语法如下:

类名::方法名
方法引用的四种形式:
  1. 静态方法引用ClassName::staticMethod
  2. 实例方法引用instance::instanceMethod
  3. 特定类型的任意对象方法引用ClassName::instanceMethod
  4. 构造方法引用ClassName::new
示例:
List<String> list = Arrays.asList("Apple", "Banana", "Orange");// 使用 Lambda 表达式
list.forEach(s -> System.out.println(s));// 使用方法引用
list.forEach(System.out::println);

好好理解上面的例子,还挺有意思,但是挺无聊;

感觉就是,有一个类他有很多方法,但是我就想要他的其中一个方法。。。。就是为了这个;


6. 注意事项

  1. 简洁性:Lambda 表达式应尽量保持简洁,避免过于复杂的逻辑。
  2. 可读性:如果 Lambda 表达式过长或逻辑复杂,应考虑使用命名方法代替。
  3. 性能:Lambda 表达式的性能与传统方式相当,但在某些情况下可能会有轻微的开销。

总结

Lambda 表达式是 Java 8 引入的一项重要特性,它通过简化函数式接口的实现,使代码更加简洁和易读。Lambda 表达式广泛应用于集合遍历、Stream API、回调函数等场景。掌握 Lambda 表达式及其相关特性(如方法引用、函数式接口),可以显著提升 Java 开发效率和代码质量。

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

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

相关文章

05 mysql之DDL

一、SQL的四个分类 我们通常可以将 SQL 分为四类&#xff0c;分别是&#xff1a; DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、 DCL&#xff08;数据控制语言&#xff09;和 TCL&#xff08;事务控制语言&#xff09;。 DDL 用于创建…

1 2 3 4 5顺序插入,形成一个红黑树

红黑树的特性与优点 红黑树是一种自平衡的二叉搜索树&#xff0c;通过额外的颜色标记和平衡性约束&#xff0c;确保树的高度始终保持在 O(log n)。其核心特性如下&#xff1a; 每个节点要么是红色&#xff0c;要么是黑色。根节点和叶子节点&#xff08;NIL节点&#xff09;是…

微服务6大拆分原则

微服务6大拆分原则 微服务拆分是指将一个大型应用程序拆分成独立服务的过程&#xff0c;在微服务拆分时&#xff0c;需要考虑以下6大微服务拆分原则 一、单一职责原则 微服务单一职责原则&#xff0c;是指每个微服务应该专注于解决一个明确定义的业务领域或功能&#xff0c;…

java: Compilation failed: internal java compiler error 报错解决方案

java: Compilation failed: internal java compiler error 报错解决方案 如下图所示&#xff1a; 在编译的时候提示 java: Compilation failed: internal java compiler error 原因&#xff1a;内部 java 编译错误,一般是编译版本不匹配。 问题解决 项目中有以下设置JDK版本…

介绍一下ReentrantLock 跟 Synchronized 区别

ReentrantLock 跟 Synchronized 区别 面试回答&#xff1a; 相同点&#xff1a; synchronized 和 ReentrantLock 都是用来保护资源线程安全的。 都可以保证可见性。 synchronized 和 ReentrantLock 都拥有可重入的特点。 从基本语义和概念上说 synchronized: Java 内建的…

第7次课 栈A

课堂学习 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子&#xff0c;如果想取出底部的盘子&#xff0c;则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素&#xff08;如整数、字符、对象等&…

ts装饰器

TypeScript 装饰器是一种特殊类型的声明&#xff0c;能够被附加到类声明、方法、访问符、属性或参数上。它本质上是一个函数&#xff0c;会在运行时被调用&#xff0c;并且被装饰的声明信息会作为参数传递给装饰器函数。 装饰器的分类 类装饰器 类装饰器作用于类构造函数&…

【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路

摘要&#xff1a;本文详细阐述了政府项目中将 MySQL 5.7 数据库迁移至 KingbaseES 的全过程&#xff0c;涵盖迁移前的环境评估、数据梳理和工具准备&#xff0c;迁移实战中的数据源与目标库连接配置、迁移任务详细设定、执行迁移与过程监控&#xff0c;以及迁移后的质量验证、系…

VB与Excel无缝连接实现指南

一、前期准备 引用Excel对象库&#xff1a; 在VB开发环境中&#xff0c;点击"项目"→"引用" 勾选"Microsoft Excel XX.X Object Library"&#xff08;XX.X代表版本号&#xff09; 创建Excel应用程序对象&#xff1a; vb Dim xlApp As Excel.…

【MySQL】数据库、数据表的基本操作

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. MySQL基础命令1.1 连接MySQL1.2 基本命令概览 2. 数据库操作2.1 创建数据库2.2 查看数据库2.3 选择数据库2.4 修改数据库2.5 删除数据库2.6 数据库备份与恢复 3. 表操作基础3.1 创建表3.2 查看表信息3.3 创建…

cursor sign in 网页登录成功,sursor软件里一直登陆不成功没有登陆信息

今天在使用cursor登陆无法登陆&#xff0c;点击sigin in打开网址登陆成功后&#xff0c;软件里一直无法显示登陆信息。 点击sigin in 在网址登陆成功后 解决办法&#xff1a; 方法1.设置windows默认应用为chrome. 办法2: 删除代理 cursor上ctrl, 打开设置&#xff0c;找到…

深入理解卷积神经网络的输入层:数据的起点与预处理核心

内容摘要 本文围绕卷积神经网络输入层展开&#xff0c;详细介绍其在网络中的重要作用&#xff0c;包括接收不同领域数据的形式及传递数据的过程。深入解读数据预处理的关键操作&#xff0c;如去均值、归一化和PCA/白化。助力读者透彻理解输入层&#xff0c;为构建高效卷积神经…

解决 MySQL 数据库无法远程连接的问题

在使用 MySQL 数据库时&#xff0c;遇到这样的问题&#xff1a; 本地可以连接 MySQL&#xff0c;但远程机器连接时&#xff0c;总是报错 Host ... is not allowed to connect to this MySQL server。 这通常是因为 MySQL 的用户权限或配置限制了远程访问。 1. 登录 MySQL 数据…

MCP认证全解析:从零到微软认证专家

MCP认证全解析&#xff1a;从零到微软认证专家 什么是MCP认证&#xff1f; Microsoft Certified Professional&#xff08;MCP&#xff09;是由微软官方颁发的技术认证&#xff0c;旨在验证IT从业者在微软技术栈&#xff08;如Azure、Windows Server、SQL Server等&#xff0…

驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域更新

一&#xff1a;概述 前面在介绍了显示模式设置&#xff08;分辨率&#xff0c;刷新率&#xff09;之后&#xff0c;本文继续分析下&#xff0c;显示区域的绘制&#xff0c;详细看看虚拟机的画面是如何由QXL显卡绘制出来的。 二&#xff1a;相关数据结构介绍 struct qxl_moni…

远程调用负载均衡LoadBalancer

1. 什么是负载均衡 负载均衡就是将负载&#xff08;工作任务&#xff0c;访问请求&#xff09;进行分摊到多个操作单元&#xff08;服务器,组件&#xff09;上进行执行。 根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。 服务端负载均衡&#xff1a;指的…

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读前言if name ‘main’parse_opt函数main函数run函数不同命令参数的推理结果常规推理命令推理命令(新增…

NextPolish1.4.1 安装与使用-bioinformatics tools54

01 简介 NextPolish 是一个用于修正由低准确度长读段&#xff08;如 ONT 或 CLR&#xff09;组装出来的基因组序列中碱基错误&#xff08;SNV/Indel&#xff09;的工具。它支持&#xff1a; 仅使用短读段 仅使用长读段 同时使用短读段与长读段 NextPolish 包含两个核心模块…

Vue3 el-tree:全选时只返回父节点,半选只返回勾选中的节点(省-市区-县-镇-乡-村-街道)

需求原因&#xff1a;全选时&#xff0c;传给接口的code数据太多了&#xff1b; 如果加上 check-strictly 父节点与子节点无关联&#xff0c;可以初步满足需求 效果如下使用了check-strictly的话&#xff0c;tree就没有了半选效果 不好的地方&#xff1a;用户体验感不好&#x…

使用 docker 安装 nacos3.x

一、安装 nacos 1.拉取镜像 使用如下指令拉取镜像 docker pull nacos/nacos-server 拉取完成后&#xff0c;可以使用以下命令查看是否拉取到对应的镜像&#xff0c;默认拉取最新镜像 docker images 2.新建挂载文件目录 mkdir -p /home/ubuntu/nacos/conf/mkdir -p /home/…