(二)Reactor核心-前置知识1

devtools/2025/3/20 18:54:00/

        本章是Reactor核心-前置知识(第一期),主要讲解Lambda表达式。回忆上一章我们学习了什么是响应式编程、基础概念、必读知识。一篇文章我不想写得太长了,文章不像是视频或者图片比较生动,文章太长了容易犯困。所以我直接上干货,能插图的地方我尽量插图,希望您能坚持看完。觉得有用的话点赞加藏关注,这就是我文思泉涌的动力。

一、lambda表达式

        Lambda 表达式是 Java 8 引入的一个重要特性,它是一种简洁的语法结构,目的是提高语言的表达能力,用于创建匿名函数。我们将通过示例了解Java lambda表达式,以及lambda表达式与函数接口、泛型函数接口和流API的使用。

        但是,在学习lambda之前,我们首先需要了解功能接口。

二、函数接口

        在 Java 中,当一个接口仅声明了一个抽象方法时,它便被定义为功能接口。该唯一的抽象方法明确地界定了此接口的预期功能与使用方式。

        在Java 7中,功能接口被视为单一抽象方法(SAM)类型。在Java 7中,SAM类型通常是通过匿名类实现的。SAM 类型即 Single Abstract Method type,也就是单抽象方法类型,它是一种在编程语言中广泛存在的概念。

        SAM 类型指的是仅包含一个抽象方法的类型,在 Java 里主要对应功能接口(Functional Interface)。由于只有一个抽象方法需要实现,所以在使用时可以更简洁地表达行为,特别是结合 Lambda 表达式或方法引用,能让代码变得更加简洁易读。

例如,包java.lang中的Runnable接口;是一个功能接口,因为它只组成一个方法,即run()。

示例1:在java中定义功能接口

java">import java.lang.FunctionalInterface;
// 使用 @FunctionalInterface 注解标记这是一个功能接口
@FunctionalInterface
interface MyFunction {// 该接口只有一个抽象方法int apply(int a, int b);
}

       代码解释: 接口MyFunction只有一个抽象方法apply(int a, int b)。因此,它是一个功能接口(函数式接口)。在这里,我们使用了注解@FunctionalInterface。该注解会强制Java编译器指示该接口是功能接口。因此,不允许有多个抽象方法。但是,它不是强制性的。

示例2:使用Java中的匿名类实现SAM

java">
public class Main {public static void main(String[] args) {// 使用 Lambda 表达式实现 MyFunction 接口MyFunction add = (a, b) -> a + b;// 调用实现的方法int result = add.apply(3, 5);System.out.println(result); }
}

        代码解释:MyFunction 接口只有一个抽象方法 apply,它是一个 SAM 类型。在 main() 方法中,使用 Lambda 表达式 (a, b) -> a + b 来实现 MyFunction 接口,这样就避免了传统的匿名内部类的繁琐写法

三、Lambda语法糖

参数列表+箭头+方法体:(参数列表)->{方法体}

1.单个表达式主体

java">() -> System.out.println("Lambdas are great");

2.代码块组成的主体

java">() -> {double pi = 3.1415;return pi;
};

注意:对于块体,您应该始终有一个return语句。但是,单个表达式主体不需要return语句。

3.带参数的Lambda表达式

        到现在为止,我们已经创建了不带任何参数的lambda表达式。但是,类似于方法,lambda表达式也可以具有参数。

例如:(n) -> (n%2)==0

示例3:将lambda表达式与参数一起使用

java">@FunctionalInterface
interface MyInterface {//抽象方法String reverse(String n);
}public class Main {public static void main( String[] args ) {//声明对MyInterface的引用//将lambda表达式分配给引用MyInterface ref = (str) -> {String result = "";for (int i = str.length()-1; i >= 0 ; i--){result += str.charAt(i);}return result;};//调用接口的方法System.out.println("Lambda reversed = " + ref.reverse("Lambda"));}
}//输出结果为:Lambda reversed = adbmaL

4.Lambda表达式结合泛型

java">普通的功能接口:只能接收String并返回String
@FunctionalInterface
interface MyInterface {String func(String n);
}泛型功能接口:能够接收任何数据类型
@FunctionalInterface
interface MyInterface<T> {T func(T n);
}

示例4:泛型功能接口和Lambda表达式

java">// MyInterface.java
@FunctionalInterface
interface MyInterface<T> {// 泛型方法T func(T t);
}// Main.java
public class Main {public static void main( String[] args ) {//声明对MyInterface的引用// MyInterface对String数据进行操作//为其分配一个lambda表达式MyInterface<String> reverse = (str) -> {String result = "";for (int i = str.length()-1; i >= 0 ; i--)result += str.charAt(i);return result;};System.out.println("Lambda reversed = " + reverse.func("Lambda"));//声明对MyInterface的另一个引用// MyInterface对整数数据进行操作//为其分配一个lambda表达式MyInterface<Integer> factorial = (n) -> {int result = 1;for (int i = 1; i <= n; i++)result = i * result;return result;};System.out.println("5的阶乘 = " + factorial.func(5));}
}

输出:

java">Lambda reversed = adbmaL
5的阶乘 = 120

        通过以上示例,Lambda表达式结合泛型功能接口,让我们编程更加的灵活。

        在 Java 中,Lambda 表达式常用于集合的遍历、过滤、映射等操作,例如使用 Stream API 对集合进行处理。等学到StreamAPI的时候,我们再着重讲解Lambda表达式结合StreamAPI的应用。

下期预告:Reactor核心-前置知识(第二期)

Reactor核心-前置知识一共有四期

(第一期):Lambda表达式

(第二期):Function函数式接口出入参定义

(第三期):StreamAPI

(第四期):线程池

什么问题都可以评论区留言,看见都会回复的

如果你觉得本篇文章对你有所帮助的,把“文章有帮助的”打在评论区

多多支持吧!!!

点赞加藏评论,是对小编莫大的肯定。抱拳了!


http://www.ppmy.cn/devtools/168699.html

相关文章

在处理欧拉函数时如何使用逆元

1. 逆元的引入 在计算欧拉函数时&#xff0c;如果 (n) 是质数&#xff0c;那么 (\phi(n) n - 1)&#xff0c;这是直接的结果。然而&#xff0c;当 (n) 是合数时&#xff0c;我们需要处理分母中的质因数 (p_i)。 为了高效计算 (\phi(n))&#xff0c;尤其是在编程实现中&#…

MSP430 Proteus 仿真作品

https://www.dong-blog.fun/post/1998 1 、 电子万年历&#xff08;采用 DS1302 及 及 TC72 等芯片&#xff09; 基本要求&#xff1a; 可显示年、月、日、星期、时、分、秒&#xff1b; 有温度显示功能。 发挥部分&#xff1a; 可调节时间和日期&#xff1b; 有农历显示功能 &…

汇能感知高品质的多光谱相机VSC02UA

VSC02UA概要 VSC02UA是一款高品质的200万像素的光谱相机&#xff0c;适用于工业检测、农业、医疗等领域。VSC02UA 包含 1600 行1200 列有源像素阵列、片上 10 位 ADC 和图像信号处理器。它带有 USB2.0 接口&#xff0c;配合专门的电脑上位机软件使用&#xff0c;可进行图像采集…

使用Python进行数据分析时,CSV文件导入的两种方法

在使用 Python 进行数据分析时&#xff0c;有多种方法可以导入 CSV 文件&#xff0c;下面详细介绍两种常用的方法&#xff1a; 1. 使用csv模块 csv模块是 Python 标准库的一部分&#xff0c;无需额外安装。它提供了一种简单且基础的方式来读取和写入 CSV 文件。 python imp…

Excel(函数进阶篇):函数与控件、定义名称、OFFSET函数、动态抓取图片

目录 函数与控件定义名称制作二级下拉菜单OFFSET函数动态抓取数据 生成折线图OFFSET函数与数据透视表让文本公式重新运算动态抓取图片透视表切片器 抓取照片制作带照片的抽奖小工具条件格式创建甘特图 函数与控件 实现员工信息表的查询&#xff0c;最终效果↓↓↓ 详细实现步骤…

C语言每日一练——day_8

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第八天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

Java面试黄金宝典3

1. 什么是 NIO 原理 缓冲区&#xff08;Buffer&#xff09;&#xff1a; 它是一个线性的、有限的基本数据元素序列&#xff0c;本质上是一块内存区域&#xff0c;被包装成了一个对象&#xff0c;以便于进行高效的数据读写操作。不同类型的基本数据都有对应的Buffer子类&#xf…

蓝桥杯day2:解码异或 后的数组

一、题意 未知 整数数组 arr 由 n 个非负整数组成。 经编码后变为长度为 n - 1 的另一个整数数组 encoded &#xff0c;其中 encoded[i] arr[i] XOR arr[i 1] 。例如&#xff0c;arr [1,0,2,1] 经编码后得到 encoded [1,2,3] 。 给你编码后的数组 encoded 和原数组 arr …