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…

Java整型字符串数组

整数类型 byte&#xff0c;字节 【1字节】表示范围:-128~127即: -2^7~2^7 -1 short&#xff0c;短整型 【2字节】表示范围: -32768~32767 int&#xff0c;整型 【4字节】表示范围: -2147483648~2147483647 long,长整型 【8字节】表示范围: -9223372036854775…

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

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

听课笔记03

小练习 使用cmd打开qq 切换盘符 qq.exe 有简单的方法吗&#xff1f; 进入多层文件夹太麻烦了。 在任意的文件夹下打开qq 怎么做 当前目录没有qq 把qq的路径记录到电脑上 环境变量 把qq的路径记录到环境变量中 设置环境变量 高级系统设置 path里放系统路径 从上往下找 可以配置任…

Bluesky数据采集框架-1

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

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

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

指针作为传入传出参数

C语言/C中&#xff0c;当函数参数为指针的时候&#xff0c;一般分为传入和传出参数&#xff1a; 指针前有const&#xff0c;认为是是传入参数&#xff1b; 指针前无const&#xff0c;一般认为是传出参数&#xff1a; 例如&#xff1a; void func(int *value)//形参前没有加…

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…

蓝桥杯STAMA比赛 科学素养题 每日一题(2022年2月-2022年10月)

二月 科学素养题 在我国山东省和山西省中间的“山"是(C ) 。 A泰山 B吕梁山 C太行山 D沂蒙山。 在一些寻宝游戏中,每个线索都会指向下一个线索的位置,玩家可以顺着这些线索一个一个找到所有的元素。这样的寻宝游戏的设计与()数据结构有着异曲同工之妙。(A) A链表 B堆栈 C堆…

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、升降机监…

代码随想录算法训练营|day40

第九章 动态规划 343.整数拆分96.不同的二叉搜索树代码随想录文章详解 343.整数拆分 dp[i]表示拆分i得到的最大乘积&#xff0c;对于[1,i)范围内的任意数j&#xff0c;dp[i]最大&#xff0c;即max(j与(i-j)乘积, j与(i-j)最大拆分结果dp[i-j]) 边界情况&#xff1a;对于一个正…

C#面:静态成员和非静态成员的区别

访问方式&#xff1a;静态成员可以通过类名直接访问&#xff0c;而非静态成员需要通过类的实例来访问。存储位置&#xff1a;静态成员存储在静态数据区&#xff0c;而非静态成员存储在堆栈或堆中&#xff0c;具体取决于它们所属的对象。生命周期&#xff1a;静态成员在程序运行…

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

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