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

本章是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

(第四期):线程池

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

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

多多支持吧!!!

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

相关推荐
中国lanwp2 分钟前
Spring 全局异常处理机制:多个 @ControllerAdvice 与重复 @ExceptionHandler
java·数据库·spring
Ashlee_code4 分钟前
关税战火中的技术方舟:新西兰证券交易所的破局之道 ——从15%关税冲击到跨塔斯曼结算联盟,解码下一代交易基础设施
java·python·算法·金融·架构·系统架构·区块链
hqxstudying2 小时前
SpringBoot启动项目详解
java·spring boot·后端
你我约定有三2 小时前
分布式微服务--Nacos作为配置中心(补)关于bosststrap.yml与@RefreshScope
java·分布式·spring cloud·微服务·架构
keepDXRcuriosity3 小时前
IDEA识别lombok注解问题
java·ide·intellij-idea
酷飞飞3 小时前
C语言的复合类型、内存管理、综合案例
java·c语言·前端
宸津-代码粉碎机4 小时前
LLM 模型部署难题的技术突破:从轻量化到分布式推理的全栈解决方案
java·大数据·人工智能·分布式·python
都叫我大帅哥4 小时前
TOGAF实战解码:六大行业案例解析与成功启示
java
都叫我大帅哥4 小时前
RabbitMQ消息确认机制:从外卖小哥到数据安全的奇幻漂流
java·rabbitmq
周航宇JoeZhou7 小时前
JP3-3-MyClub后台后端(二)
java·mysql·vue·ssm·springboot·项目·myclub