Java基础之lambda表达式(五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Java基础之lambda表达式

2.java lambda表达式介绍

  • Java的Lambda表达式是Java 8引入的一种新特性,允许我们以更简洁的方式表示匿名函数。Lambda表达式可以看作是一种简洁的、函数式编程风格的代码块。

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

(parameter-list) -> { function-body }

parameter-list:表示输入参数列表
->:表示Lambda运算符
function-body:表示是Lambda函数体。

以下是一些Lambda表达式的例子:

1.无参数Lambda表达式:

() -> { System.out.println("Hello, World!"); }

2.单个参数的Lambda表达式(参数类型可以省略):

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

3.多个参数的Lambda表达式:

(x, y) -> { System.out.println(x + y); }

4.当Lambda函数体只有一条语句时,可以省略大括号和return关键字:

(x, y) -> x + y

Lambda表达式通常与函数式接口一起使用,例如Java的Runnable,Comparator等接口。从Java 8开始,接口可以有默认方法和静态方法,这使得接口可以包含实现,从而可以像类一样使用。如果一个接口只有一个抽象方法,那么这个接口就是一个函数式接口。

例如,使用Lambda表达式和函数式接口Comparator进行排序:

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);  Collections.sort(numbers, (a, b) -> a - b);  System.out.println(numbers);

在这个例子中,(a, b) -> a - b就是一个Lambda表达式,它实现了Comparator接口的compare方法,用于比较两个整数的大小。

3.Java Lambda 表达式

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

Lambda 表达式语法
lambda 表达式的语法格式如下:
方式一:
(parameters) -> expression方式二:
(parameters) ->{ statements; }

**
parameters:表示参数列表。
expression 或 { statements; } :表示Lambda 表达式的主体。
如果只有一个参数,可以省略括号;
如果没有参数,也需要空括号。
**

Lambda 表达式的简单例子:1. 不需要参数,返回值为3
() -> 3  2. 接收一个参数,返回其3倍的值  
x -> 3 * x  3. 接受2个参数,并返回他们的差值  
(x, y) -> x – y  4. 接收2int型整数,返回他们的和  
(int x, int y) -> x + y  5. 接受一个String 对象,并打印,不返回任何值
(String s) -> System.out.print(s)

4.lambda表达式代码实例

v1.0

public class Test {public static void main(String args[]){SAY say = message -> System.out.println("Hello " + message);say.print("Friends.");}interface SAY {void print(String message);}
}
注释:
message 是一个字符串(String)类型的参数。它是SAY接口中print方法的参数。
代码中的 message -> System.out.println("Hello " + message); 是一个Lambda表达式,它创建了一个实现了SAY接口的匿名类实例。
这个Lambda表达式实现了print方法,当调用print方法并传入一个字符串参数时,它会打印出"Hello ",后跟传入的字符串参数。具体来说,message -> System.out.println("Hello " + message); 这个Lambda表达式的意思是:
message 是这个Lambda表达式的参数,它的类型由print方法的定义决定,即String类型。
System.out.println("Hello " + message); 是这个Lambda表达式的主体,它实现了print方法的功能,即打印出"Hello "后跟message的值。

v2.0

  • Lambda表达式的固定语法:
(parameter-list) -> { function-body }
public class Test1 {interface SAY {void print(int mess);}interface ADD {void add(int a, int b);}public static void main(String args[]){//v1.0//SAY say = (message) -> System.out.println("Hello " + message);SAY say = (message) -> {System.out.println("Hello " + message);};say.print(1234);//v2.0//ADD at = (a, b) -> System.out.println("a = " + a + " b = " +b);ADD at = (a, b) -> {System.out.println("a = " + a + " b = " + b);};at.add(12,34);}
}

(message):表示参数.
->: 表示Lambda运算符.
{System.out.println("Hello " + message);};:表示函数体.
say:表示SAY类的对象.

ADD接口和lambda表达式本质解释:

ADD at = (a, b) -> {System.out.println("a = " + a + " b = " + b);}; 是一个赋值语句。这行代码做了以下几件事:
定义了一个名为 at 的变量,它的类型是 ADD。
ADD 是一个函数式接口,它有一个抽象方法 add(int a, int b)。
使用 Lambda 表达式 (a, b) -> {System.out.println("a = " + a + " b = " + b);} 来创建 ADD 接口的一个实例。
这个 Lambda 表达式实现了 ADD 接口的 add 方法。(a, b) 是参数列表,表示 add 方法接受两个整数参数。
-> 是 Lambda 运算符,它分隔了参数列表和 Lambda 函数体。
{System.out.println("a = " + a + " b = " + b);} 是 Lambda 函数体,它包含了要执行的代码。
在这个例子中,代码是打印参数 a 和 b 的值。
最后,这个 Lambda 表达式创建的 ADD 接口实例被赋值给变量 at。因此,ADD at = (a, b) -> {System.out.println("a = " + a + " b = " + b);}; 是一行赋值语句,
它创建了一个 ADD 类型的对象(实际上是一个 Lambda 表达式),并将其赋值给变量 at。
之后,你可以通过调用 at.add(12, 34); 来执行这个 Lambda 表达式,它会打印出 a = 12 b = 34。

问题:既然是(a, b) -> {System.out.println("a = " + a + " b = " + b);};实现了接口类ADD的方法add,那么为什么可以将(a, b) -> {System.out.println("a = " + a + " b = " + b);};赋值给at对象,而不是add方法呢?

你是在创建一个ADD类型的对象(即一个函数式接口的实例),并将这个Lambda表达式(实现了add方法的实例)赋值给变量at。
这里,at是一个函数式接口的引用,而不是一个方法的引用。在Java中,方法的调用是通过对象(或类的静态上下文)来完成的。
因此,当你调用at.add(12, 34);时,你实际上是在通过at这个对象(即函数式接口的实例)来调用add方法,
而这个方法是由Lambda表达式提供的实现。简而言之,(a, b) -> {System.out.println("a = " + a + " b = " + b);}这个Lambda表达式创建了一个匿名类,
这个匿名类实现了ADD接口,并重写了add方法。然后,这个匿名类的实例被赋值给了at变量。
当你调用at.add(12, 34);时,你实际上是在调用这个匿名类实例的add方法。

v3.0

emacs SimpleLambdaExample.java

public class SimpleLambdaExample {public static void main(String[] args) {// Lambda 表达式:带有参数和返回值Calculator addOperation = (a, b) -> a + b;// 调用 Lambda 表达式int result = addOperation.calculate(5, 3);// 打印结果System.out.println("Result: " + result);}// 函数式接口定义@FunctionalInterfaceinterface Calculator {int calculate(int a, int b);}
}

编译:
javac SimpleLambdaExample.java
javac SimpleLambdaExample

v4.0

// CarServiceProviderExample.java// 导入必要的类
import java.util.ArrayList;
import java.util.List;// 定义 Car 类
class Car {private String model;// Car 类的构造方法public Car(String model) {this.model = model;}// 获取汽车型号的方法public String getModel() {return model;}
}// 定义 CarServiceProvider 类
class CarServiceProvider {// 存储 CarListener 实例的列表private List<CarListener> listeners = new ArrayList<>();// 添加 CarListener 到列表的方法public void addListener(CarListener listener) {listeners.add(listener);}// 通知所有监听器有关 Car 对象的方法public void notifyListeners(Car car) {// 遍历监听器列表,并为每个调用 onCarEvent 方法for (CarListener listener : listeners) {listener.onCarEvent(car);}}
}// 定义 CarListener 的函数式接口
@FunctionalInterface
interface CarListener {// 监听器必须实现的抽象方法void onCarEvent(Car car);
}// 主例程
public class CarServiceProviderExample {public static void main(String[] args) {// 创建 CarServiceProvider 实例CarServiceProvider carServiceProvider = new CarServiceProvider();// 使用 lambda 表达式添加一个 CarListenercarServiceProvider.addListener(car -> {// 当接收到事件时打印消息System.out.println("收到汽车型号:" + car.getModel());});// 创建一个模拟的 Car 对象,型号为 "特斯拉"Car simulatedCar = new Car("特斯拉");// 通知监听器有关模拟汽车事件carServiceProvider.notifyListeners(simulatedCar);}
}

编译:
javac CarServiceProviderExample.java
javac CarServiceProviderExample

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

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

相关文章

《Python 语音转换简易速速上手小册》第9章 特定领域的语音处理(2024 最新版)

文章目录 9.1 语音处理在不同行业的应用9.1.1 基础知识9.1.2 主要案例:智能客服机器人案例介绍案例 Demo案例分析9.1.3 扩展案例 1:医疗语音助手案例介绍案例 Demo案例分析9.1.4 扩展案例 2:语言学习应用案例介绍案例 Demo

Python 实现Hash算法验证

目录 一、Hash 算法的原理及作用 二、python验证Hash算法代码实现 三、运行脚本验证如下 四、在线工具验证结果如下 五、总结 一、Hash 算法的原理及作用 Hash加密算法是一种将任意长度的消息压缩成固定长度散列值的算法。它的特点是快速、不可逆和安全。对于相同的消息&a…

陪玩软件系统的开发-用PHP书写,uni开发的陪玩平台更有质量-线上线下功能齐全-APP小程序H5公众号都有,源码交付!

线上陪玩系统的功能 在线预订&#xff1a;用户可以在陪玩系统中在线预订陪玩服务&#xff0c;系统会根据用户的订单要求自动匹配陪玩人员。 指定搜索&#xff1a;用户可以通过搜索指定的ID来找到他们想要的陪玩人员。 在线交流&#xff1a;在陪玩系统中提供在线沟通功能&…

Bluesky数据采集框架-1

Bluesky是一个用于实验控制和科学数据和元数据采集的库。它强调以下特点&#xff1a; 1、实时&#xff0c;流式数据&#xff1a;可用于嵌入可视化和处理。 2、丰富元数据&#xff1a;获取和组织来方便复制性和可检索性。 3、实验通用性&#xff1a;对完全不同的硬件无缝地重…

提升装备制造企业竞争力:2023年CRM选型与应用完全解读

在加快产业转型升级的大背景下&#xff0c;高端装备制造业既面临机遇也面临挑战。随着公司规模的不断壮大&#xff0c;再加上装备制造业营销体系及服务体系管理体系的复杂性&#xff0c;一些问题逐渐暴露出来&#xff0c;装备制造业企业需要根据自身业务需求和管理流程选择合适…

fpga_RGB模型与硬件加速思维

一 RGB模型 人眼之所以可以看到各种颜色的光&#xff0c;主要是红绿蓝三种感光细胞综合感觉的结果&#xff0c;而红绿蓝三色被称为三原色。 饱和度均为100%的RGB能组合成8种颜色&#xff0c;计算机处理的BMP图片为24bit的位图&#xff0c;即每一通道的颜色可以组合为2的8次方&a…

训练Sora模型,你可能需要这些开源代码,模型,数据集及算力评估

在之前的文章&#xff0c;我们总结了Sora模型上用到的一些核心技术和论文 复刻大模型 Sora 有多难&#xff1f;一张图带你读懂 Sora 的技术路径一文看懂大模型 Sora 技术推演 今天这篇文章来自我们社区讨论交流&#xff0c;我这边整理和总结现有的一些开源代码、模型、数据集…

Java面试问题集锦

1.JDK、JRE、JVM 三者有什么关系&#xff1f; JDK&#xff08;全称 Java Development Kit&#xff09;&#xff0c;Java开发工具包&#xff0c;能独立创建、编译、运行程序。 JDK JRE java开发工具&#xff08;javac.exe/java.exe/jar.exe) JRE&#xff08;全称 Java Runtim…

计算机设计大赛 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

easyrecovery数据恢复软件14中文绿色版下载

EasyRecovery易恢复14全面介绍 一、功能概览 EasyRecovery易恢复14是一款功能强大的数据恢复软件&#xff0c;旨在帮助用户从各种存储介质中恢复丢失或删除的文件。无论是由于误删、格式化、系统崩溃还是其他未知原因导致的数据丢失&#xff0c;EasyRecovery易恢复14都能提供…

postman测试上传文件、导出excel的方法

按照如下操作步骤执行就可以了&#xff1a; 1、PostMan测试接口实现上传文件 第一步&#xff1a; 打开postman&#xff0c;将上传方式改为POST&#xff0c;再点击下【Body】 第二步&#xff1a; 然后&#xff0c;我们点击里面的【form-data】选项(如图所示)。 第三步&#xff…

Vue+SpringBoot打造超市自助付款系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示六、…

Java智慧工地云综合管理平台SaaS源码 助力工地实现精细化管理

目录 智慧工地系统介绍 1、可视化大屏 2、视频监控 3、Wi-Fi安全教育 4、环境监测 5、高支模监测 6、深基坑监测 7、智能水电监测 8、塔机升降安全监测 智慧工地系统功能模块 1、基础数据管理 2、考勤管理 3、安全隐患管理 4、视频监控 5、塔吊监控 6、升降机监…

在 where子句中使用子查询(一)

目录 子查询返回单行单列 查询公司工资最低的员工信息 查找公司雇佣最早的员工信息 子查询返回单行多列 查询与 ALLEN 工资相同&#xff0c;职位相同的所有员工信息 子查询返回多行单列 IN 操作 查询职位是“MANAGER”的所有员工的薪水 Oracle从入门到总裁:https://bl…

2024022401-关系数据库设计理论

关系数据库设计理论 设计一个好的关系数据库系统&#xff0c;关键是要设计一个好的数据库模式&#xff08;数据库逻辑设计问题&#xff09; 数据库逻辑设计主要解决的问题 关系数据库应该组织成几个关系模式 关系模式中包括哪些属性 “不好”的数据库设计 举例&#xff1a…

雷达铅笔波束

黄色区域&#xff1a;铅笔波束 构图思想&#xff1a;先刷黄色三角形&#xff0c;在刷黄色圆 //画波束&#xff0c;//小飞机->扇形区域->铅笔波束painter->save();{ int diameter 26;//第一步先看画家当前坐标原点//测定&#xff08;17&#xff0c;-2&#xff09;坐标…

【flutter】环境安装

安装flutter sdk 下载sdk flutter sdk就包含dart&#xff0c;所以我们只用安装flutter sdk就可以了。 我们去清华大学开源软件镜像站下载&#xff0c;flutter开发中&#xff0c;版本对不上基本项目就跑步起来&#xff0c;如果是团队协同开发的话&#xff0c;建议统一下载指定版…

【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现

创建时间&#xff1a;2024-02-23 最后编辑时间&#xff1a;2024-02-24 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)

背景需求 上学期的周安排里&#xff0c;每班每周的自主游戏会轮到多个不同的内容 因此在每周的自主游戏观察有2次记录&#xff0c;观察的项目可以写不一样的&#xff0c; 如一位老师写沙水游戏&#xff0c;另一位写表演游戏 本学期&#xff0c;中班的自主游戏全部是户外的&am…

vue 手势解锁功能

效果 实现 <script setup lang"ts"> const canvasRef ref<HTMLCanvasElement>() const ctx ref<CanvasRenderingContext2D | null>(null) const width px2px(600) const height px2px(700) const radius ref(px2px(50))const init () > …