java8 Lambda表达式简介

本文深入讲解了Java8中Lambda表达式的概念与用法,包括其基础语法、不同场景的应用实例及函数式接口的支持等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在《java8实战》这本书中,对Lambda的解释如下:

可以把Lambda表达式理解为简洁的表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。

lambda表达式基础语法:

    java中,引入了一个新的操作符“->”,该操作符在很多资料中,称为箭头操作符,或者lambda操作符;箭头操作符将lambda分成了两个部分:

    1.   左侧:lambda表达式的参数列表
    2.   右侧:lambda表达式中所需要执行的功能,即lambda函数体
    3.lambda表达式语法格式;

        1).无参数,无返回值的用法 :() -> System.out.println("hello lambda");

   

@Test
	public void test1() {
		Runnable r = new Runnable() {
			@Override
			public void run() {
				System.out.println("hello runnable");
			}
		};
		r.run();
		Runnable r1 = () -> System.out.println("hello lambda");
		r1.run();
	}

        2).有一个参数,无返回值的用法: (x) -> System.out.println(x); 或者 x -> System.out.println(x); 一个参数,可以省略参数的小括号

@Test
	public void test2(){
		Consumer<String> con = (x) -> System.out.println(x);
		con.accept("有一个参数,无返回值的用法(Consumer函数式接口)");
	}

3).有两个参数,有返回值的:(x, y) -> x + y

public void test3() {
		BinaryOperator<Integer> binary = (x, y) -> x + y;
		System.out.println(binary.apply(1, 2));// 3
	}

4).剩下的多个参数,就不在继续介绍了,按照上面的推测,就可以了,上面的例子,函数体中,都是一行语句,最后一个语法,介绍下,lambda表达式中,多行语句,分别在无返回值和有返回值的抽象类中的用法

@Test
	public void test4() {
		// 无返回值lambda函数体中用法
		Runnable r1 = () -> {
			System.out.println("hello lambda1");
			System.out.println("hello lambda2");
			System.out.println("hello lambda3");
		};
		r1.run();

		// 有返回值lambda函数体中用法
		BinaryOperator<Integer> binary = (x, y) -> {
			int a = x * 2;
			int b = y + 2;
			return a + b;
		};
		System.out.println(binary.apply(1, 2));// 6

	}

可以看到,多行的,只需要用大括号{}把语句包含起来就可以了;有返回值和无返回值的,只有一个return的区别;只有一条语句的,大括号和renturn都可以不用写;

5).lambda的类型推断

@Test
	public void test5() {
		BinaryOperator<Integer> binary = (Integer x, Integer y) -> x + y;
		System.out.println(binary.apply(1, 2));// 3
	}

可以看到,在lambda中的参数列表,可以不用写参数的类型,跟java7中 new ArrayList<>(); 不需要指定泛型类型,这样的<>棱形操作符一样,根据上下文做类型的推断

 

lamabd表达式中,需要有函数式接口的支持;

函数式接口定义:接口中只有一个抽象方法的接口,称为函数式接口;

可以使用@FunctionalInterface注解修饰,对该接口做检查;如果接口里,有多个抽象方法,使用该注解,会有语法错误

 

 

 

 

### STM32 F7 系列 SPI 功能及使用方法 #### 1. STM32F7 系列中的 SPI 接口概述 STM32F7 系列微控制器支持多个 SPI 外设,这些外设能够实现同步串行数据传输。SPI 是一种高速、全双工的通信协议,通常用于连接闪存、传感器和其他外部设备。具体的引脚映射可以通过查阅 STM32F7 数据手册来确认,不同型号可能具有不同的引脚分配方案[^1]。 #### 2. SPI 初始化过程 为了启用 SPI 功能,需要完成一系列初始化操作。以下是主要步骤: - 配置 GPIO 引脚作为 SPI 的 SCK(时钟)、MOSI(主输出/从输入)和 MISO(主输入/从输出)。某些情况下还需要配置 NSS(片选信号)。 - 设置 SPI 控制寄存器 CR1 和 CR2 中的相关参数,比如工作模式(主机或从机)、数据帧格式以及波特率分频因子等。 - 启用 SPI 设备并使其进入正常运行状态。 对于 STM32F7 而言,在软件层面可通过 HAL 库简化上述流程。例如,当涉及 SPI5 这一特定实例时,默认会将其频率设定为系统时钟除以 256;如果希望调整该速率,则可调用 `SPI5_SetSpeed` 函数动态修改预分频值[^2]: ```c void SPI5_SetSpeed(uint8_t SPI_BaudRatePrescaler) { assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); // 判断有效性 __HAL_SPI_DISABLE(&SPI5_Handler); // 关闭 SPI SPI5_Handler.Instance->CR1 &= 0xFFC7; // 清零位 3-5 (波特率控制位) SPI5_Handler.Instance->CR1 |= SPI_BaudRatePrescaler; // 设置新的波特率分频系数 __HAL_SPI_ENABLE(&SPI5_Handler); // 重新使能 SPI } ``` 此代码片段展示了如何更改 SPI5 的通讯速度,其中利用了硬件抽象层(HAL) 提供的一些宏定义来进行资源管理与访问保护。 #### 3. 使用 DMA 实现高效的数据交换 除了基本的轮询方式之外,还可以借助直接内存存取(DMA) 技术进一步提升性能表现。DMA 可让处理器无需频繁干预即可自动处理大批量连续读写请求,从而释放 CPU 时间去执行其它更重要的任务。下面是一个基于 HAL 库实现 SPI 收发结合 DMA 的例子[^4]: ```c // 假定已正确设置了 hspi 结构体成员变量及其回调机制 uint8_t txBuffer[] = { /* 发送缓冲区 */ }; uint8_t rxBuffer[sizeof(txBuffer)] = {0}; // 接收缓冲区 if (HAL_OK != HAL_SPI_TransmitReceive_DMA(&hspi, txBuffer, rxBuffer, sizeof(txBuffer))) { Error_Handler(); // 错误处理逻辑 } // 在中断上下文中或者指定事件触发后检查传输是否已完成... ``` 以上程序段说明了怎样启动一次异步双向传送动作,并且指定了源地址(`txBuffer`)目标位置(`rxBuffer`)还有总字节数目。一旦发起命令之后,整个过程中几乎不需要额外关注细节直到最终结束为止。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值