Java 之 Lambda表达式

前言:在Java 8之前,匿名内部类一直是实现接口或抽象类的常见方式,但它们往往冗长繁琐,影响代码的可读性和可维护性。为了解决这个问题,Java 8 引入了Lambda表达式,它提供了一种更简洁、更优雅的方式来表示匿名函数。

1. 什么是Lambda表达式?

Lambda表达式本质上是一种匿名函数,它可以表示一个方法,但不需要显式定义方法名和返回类型。Lambda表达式由以下部分组成:

  • 参数列表: 可以是零个或多个参数,用圆括号括起来,参数之间用逗号分隔。

  • 箭头符号: ->,将参数列表与方法体分隔开。

  • 方法体: 包含要执行的代码块,可以是一个表达式或一个代码块。

语法格式:

(参数列表) -> 方法体

2. 函数式接口与Lambda表达式

Lambda表达式与函数式接口密切相关。函数式接口只有一个抽象方法,Lambda表达式可以用来实现这个抽象方法。

什么是函数式接口?

函数式接口是一个接口,它只有一个抽象方法。Java标准库中定义了许多函数式接口,例如 Runnable、Predicate、Function 等。

Lambda表达式与函数式接口的结合:

Lambda表达式可以用来实现函数式接口的抽象方法,从而简化代码。

// 定义一个函数式接口
@FunctionalInterface
interface MyFunction {int apply(int x);
}// 使用Lambda表达式实现函数式接口
MyFunction square = x -> x * x;// 调用Lambda表达式
int result = square.apply(5);
System.out.println(result); // 输出: 25

3. Stream API与Lambda表达式

Stream API 是Java 8引入的一个强大的工具,它允许你以函数式的方式处理数据集合。Stream API 提供了一系列操作,例如过滤、映射、排序、聚合等,可以让你更简洁地处理数据。

Stream API的基本概念:

  • Stream: 一个Stream是一个数据流,它可以是集合、数组或其他数据结构的视图。

  • 操作: Stream API提供了一系列操作,例如 filter、map、reduce 等,可以用来处理Stream中的数据。

  • 管道: Stream操作可以串联起来形成一个管道,数据会依次经过每个操作的处理。

Stream API的优势:

  • 简洁: Stream API的语法简洁易懂,可以更简洁地表达数据处理逻辑。

  • 高效: Stream API利用了并行处理技术,可以提高数据处理效率。

  • 函数式: Stream API采用函数式编程风格,可以提高代码的可读性和可维护性。

Lambda表达式与Stream API的结合:

Lambda表达式可以作为Stream API操作的参数,例如 filter、map、reduce 等操作。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用Lambda表达式过滤偶数
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());System.out.println(evenNumbers); // 输出: [2, 4]

4. 匿名内部类与Lambda表达式

在Java中,匿名内部类是一种没有名称的类,通常用于创建对象实例,特别是当类只使用一次时。然而,使用匿名内部类可以导致代码冗长和难以维护。Java 8引入的Lambda表达式提供了一种更简洁和现代的方法来实现相同的功能。

匿名内部类

匿名内部类通常用于实现接口或继承类,而不需要显式地声明一个完整的类。它们在实现事件监听器或回调接口时特别有用。例如,实现一个Runnable接口来创建一个新线程:

new Thread(new Runnable() {public void run() {System.out.println("Thread is running");}
}).start();

Lambda表达式

Lambda表达式提供了一种更简洁的方式来实现相同的功能。它们允许你用一行代码代替多行代码来实现接口的单个抽象方法。使用Lambda表达式重写上述代码:

new Thread(() -> System.out.println("Thread is running")).start();

优势对比

  1. 代码简洁性:Lambda表达式通常比匿名内部类更简洁,减少了代码的冗余。
  2. 可读性:Lambda表达式通常更易于阅读和理解,因为它们直接表达了意图。
  3. 性能:Lambda表达式可以减少内存占用和提高性能,因为它们可以被编译器优化。
  4. 类型推断:Lambda表达式允许编译器推断参数类型,减少了显式类型声明的需要。

示例:使用Lambda表达式替代匿名内部类

假设有一个接口Operation,它有一个方法apply,接受一个整数并返回一个整数:

@FunctionalInterface
interface Operation {int apply(int x);
}// 使用匿名内部类
Operation op = new Operation() {public int apply(int x) {return x * x;}
};// 使用Lambda表达式
Operation opLambda = x -> x * x;

在这个例子中,使用Lambda表达式不仅减少了代码量,而且提高了代码的可读性和维护性。Lambda表达式是现代Java编程中处理函数式编程任务的首选方式。

5. Lambda表达式的应用场景

Lambda表达式可以应用于各种场景,例如:

  • 实现函数式接口: 函数式接口只有一个抽象方法,Lambda表达式可以用来实现这个抽象方法。

  • 作为参数传递给方法: 许多方法接受一个函数作为参数,例如 forEach、map、filter 等方法。

  • 创建事件处理程序: Lambda表达式可以用来创建事件处理程序,例如按钮点击事件、鼠标移动事件等。

6. Lambda表达式的优势

  • 代码简洁: Lambda表达式可以显著简化代码,使其更易读、更易维护。

  • 提高可读性: Lambda表达式更接近自然语言的表达方式,更容易理解代码的意图。

  • 增强代码复用性: Lambda表达式可以作为函数式接口的实现,方便代码复用。

7. 代码示例

1). 使用Lambda表达式实现Runnable接口:

// 传统方式
Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello from Runnable!");}
};// 使用Lambda表达式
Runnable runnableLambda = () -> System.out.println("Hello from Lambda!");// 执行Runnable
new Thread(runnable).start();
new Thread(runnableLambda).start();

2). 使用Lambda表达式和Stream API处理集合:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用Lambda表达式过滤偶数
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());System.out.println(evenNumbers); // 输出: [2, 4]

8. 为什么需要Lambda表达式?

在Java 8之前,实现匿名内部类需要大量的代码,这使得代码变得冗长、难以维护。Lambda表达式提供了更简洁、更优雅的解决方案,它简化了代码,提高了可读性和可维护性。

9. 练习

1). 使用Lambda表达式实现Comparator接口,对字符串列表进行排序:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 使用Lambda表达式实现Comparator接口
Comparator<String> comparator = (s1, s2) -> s1.compareToIgnoreCase(s2);// 对字符串列表进行排序
names.sort(comparator);System.out.println(names); // 输出: [Alice, Bob, Charlie, David]

2). 使用Lambda表达式和Stream API计算列表中所有元素的平方和:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用Lambda表达式计算平方和
int sumOfSquares = numbers.stream().map(n -> n * n).reduce(0, Integer::sum);System.out.println(sumOfSquares); // 输出: 55

结语:以上就是关于Lambda表达式的相关知识和其相近的知识点的讲解,希望能够帮助各位看官理解Java Lambda表达式的概念、应用场景和好处,感谢各位看官的观看,下期见,谢谢~

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

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

相关文章

大屏地图区域显示、复选框多选打点,自定义窗体信息(vue3+TS)

效果图&#xff1a; NPM 安装 Loader&#xff1a; npm i amap/amap-jsapi-loader --save 并设置 key 和安全密钥&#xff1a; import AMapLoader from amap/amap-jsapi-loader;//引入高德地图window._AMapSecurityConfig {securityJsCode: "「你申请的安全密钥」"…

【Rust】008-常用集合

【Rust】008-常用集合 文章目录 【Rust】008-常用集合一、动态数组: Vec<T>1、引入2、三种常见初始化方式第一种&#xff1a;初始化一个长度为零且不进行内存分配的数组第二种&#xff1a;初始化一个长度为零但提前分配好16个元素大小内存的数组第三种&#xff1a;使用ve…

基于YOLO深度学习和百度AI接口的手势识别与控制项目

基于YOLO深度学习和百度AI接口的手势识别与控制项目 项目描述 本项目旨在开发一个手势识别与控制系统&#xff0c;该系统能够通过摄像头捕捉用户的手势&#xff0c;并通过YOLO深度学习模型或调用百度AI接口进行手势识别。识别到的手势可以用来控制计算机界面的操作&#xff0…

同样实用的CSS剪裁属性clip-path

clip-path CSS 属性是一个强大的工具&#xff0c;它允许你创建复杂的形状来剪裁元素的可视区域。这意味着你可以指定一个元素仅显示其形状内的部分&#xff0c;其余部分则不可见。这在创建独特的设计效果时特别有用&#xff0c;比如按钮、图片、文本或其他任何HTML元素。 基本…

浅谈WebApi

一、基本介绍 Web API&#xff08;Web应用程序编程接口&#xff09;是一种用于构建应用程序的接口&#xff0c;它允许软件应用程序通过HTTP请求与Web服务器进行交互。Web API通常用于构建客户端-服务器应用程序&#xff0c;其中客户端可以是Web浏览器、移动应用程序、桌面应用程…

单机docker-compose部署minio

单机多副本docker-compose部署minio 简单介绍 如果服务器有限可以单机挂载多硬盘实现多副本容错&#xff08;生产不推荐&#xff09; 部署好的文件状态 有两个重要文件 docker-compose.yaml和nginx.conf docker-compose.yaml是docker部署容器的配置信息包括4个minio和1个ng…

[数据集][目标检测]男女性别检测数据集VOC+YOLO格式9769张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9769 标注数量(xml文件个数)&#xff1a;9769 标注数量(txt文件个数)&#xff1a;9769 标注…

Miracast/WifiDisplay开发相关的深入调研分析-android投屏实战开发

Miracast/WifiDisplay概念介绍 Miracast Miracast是由Wi-Fi联盟于2012年所制定&#xff0c;以Wi-Fi直连&#xff08;Wi-Fi Direct&#xff09;为基础的无线显示标准。支持此标准的消费性电子产品&#xff08;又称3C设备&#xff09;可透过无线方式分享视频画面&#xff0c;例如…

CSS学习17--CSS3 过渡、2D变形、3D变形、动画

CSS3 过渡、2D变形、3D变形、动画 一、过渡二、2D变形 transform1.移动 translate2.缩放 scale3. 旋转 rotate4. 倾斜 skew 三、3D变形1. rotateX&#xff08;&#xff09;rotateY&#xff08;&#xff09; rotateZ&#xff08;&#xff09;2. 体会透视 perspective3. translat…

Array对象:

4.1 创建数组对象 var arrObnew Array(值,........) var arrObArray(值,.......) var arrOb[值,.........] var arrObnew Array(n); arrOb[0]值1; arrOb[1]值2; ....... 4.2 属性 length //数组中元素的数目 4.3 方法 转为字符串 String() //将数组转换为字符串&#x…

vue项目本地可以访问接口,浏览器输入接口可以访问数据,部署到服务器无法报接口404

需求变动&#xff0c;原本访问python的后端接口&#xff0c;现在新增Java的接口 新增的接口在服务器上一直404 &#xff0c;本地正常&#xff0c;浏览器输入路径正常。 两个后端不同端口&#xff0c;前端配置了两个转发如下&#xff1a; dev: {// PathsassetsSubDirectory: st…

虚拟现实智能家居实训系统实训解决方案

随着科技的飞速发展&#xff0c;智能家居已成为现代生活的重要组成部分&#xff0c;它不仅极大地提升了居住的便捷性与舒适度&#xff0c;还推动了物联网、大数据、人工智能等前沿技术的融合应用。为了满足市场对智能家居专业人才日益增长的需求&#xff0c;虚拟现实智能家居实…

搭建 WordPress 及常见问题与解决办法

浪浪云活动链接 &#xff1a;https://langlangy.cn/?i8afa52 文章目录 环境准备安装 LAMP 堆栈 (Linux, Apache, MySQL, PHP)配置 MySQL 数据库 安装 WordPress配置 WordPress常见问题及解决办法数据库连接错误白屏问题插件或主题冲突内存限制错误 本文旨在介绍如何在服务器上…

Linux下vscode配置C++和python编译调试环境

Visual Studio Code (简称 VSCode) 是由微软开发的一款免费、开源、跨平台的代码编辑器。它支持 Windows、macOS 和 Linux 操作系统&#xff0c;并且内置对多种编程语言的支持&#xff0c;包括但不限于 C/C、Python、JavaScript、TypeScript、Java 和 Go 等。VSCode 主要用于编…

HarmonyOS ArkUI 构建布局

文章目录 一、构建布局1.线性布局 (Row/Column)1.1 Blank空白填充组件1.2 layoutWeight 自适应缩放1.3 自适应延伸 2.弹性布局 (Flex)3.栅格布局 (GridRow/GridCol)3.创建列表 (List) 一、构建布局 1.线性布局 (Row/Column) 线性布局文档 通过线性容器Row和Column构建 Column…

SpringBoot项目获取统一前缀配置以及获取非确定名称配置

SpringBoot项目获取统一前缀配置以及获取非确定名称配置 在SpringBoot项目中&#xff0c;我们经常看到统一前缀的配置&#xff0c;我们该怎么统一获取 my.config.a.namexiaoming my.config.a.age18 my.config.a.addressguangdong my.config.b.namexiaomli my.config.b.age20 my…

《深度学习》OpenCV 高阶 图像金字塔 用法解析及案例实现

目录 一、图像金字塔 1、什么是图像金字塔 2、图像金字塔作用 1&#xff09;金字塔尺度间的图像信息补充 2&#xff09;目标检测与识别 3&#xff09;图像融合与拼接 4&#xff09;图像增强与去噪 5&#xff09;图像压缩与编码 二、用法解析 1、向下采样 1&#xff09;概念…

使用SQL语句查询MySQL数据表

6.1 创建单表基本查询 1&#xff0e;Select 语句的语法格式及其功能 &#xff08;1&#xff09;Select 语句的一般格式。 Select < 字段名称或表达式列表 > From < 数据表名称或视图名称 > [ Where < 条件表达式 > ] [ Group By < 分组的字段名称…

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示 $str $_GET["name"]; //接受URL来的get形式的name传参 echo "<h2 aligncenter>欢迎用户".$str."</h2>";//在网页输出&#x…

STM32 之 SDRAM 详解

目录 前言 一、SDRAM 简介 二、SDRAM的组成原理 2.1存储单元阵列 2.1.1地址译码 2.1.2存储电容 2.2控制逻辑 2.2.1时钟同步 2.2.2命令解码 2.2.3模式寄存器 2.3数据输入 / 输出缓冲 2.3.1数据总线 2.3.2数据锁存 2.4刷新电路 2.4.1自动刷新 2.4.2自刷新 三、S…