[Java SE] FunctionInterface 注解: 函数式接口(JDK8+)

news/2025/2/23 10:53:11/文章来源:https://www.cnblogs.com/johnnyzen/p/18731905

概述:FunctionInterface/函数式接口

简介

  • 函数式接口是指只包含一个抽象方法的接口,可以使用 Lambda 表达式来创建该接口的实例

  • @FunctionalInterface 注解是 Java Lang 包中的一个注解,用于标识一个接口是函数式接口

  • @FunctionalInterface 注解的作用:

  • 编译时检查@FunctionalInterface 注解会在编译时检查标注的接口是否符合函数式接口的定义,即是否只有一个抽象方法。如果不符合,编译器会报错,提醒开发者修正。
  • Lambda 表达式支持:函数式接口的存在主要是为了支持 Lambda 表达式,通过 Lambda 表达式可以简化代码,提高代码的可读性。
  • 事实上,即使没有加 @FunctionalInterface 注解,只要符合函数式接口的定义就是函数式接口

在 Spring Boot 框架中,经常使用的 CommandLineRunnerApplicationRunner 等等都是函数式接口。

函数式接口的使用场景

回调函数(Callback Functions)

  • 在一些异步操作或模板方法中,我们可以使用函数式接口来传递回调函数,从而实现定制化的操作。

事件监听器(Event Listeners)

  • 通过函数式接口可以定义事件监听器,用于监听特定事件的发生并执行相应的处理逻辑。

  • 在Spring boot 框架中,事件监听器通常用于处理应用程序内部的事件,如应用启动、关闭、Bean初始化完成等。

Stream API

  • 在Java 8及以上版本中,引入了Stream API,可以通过函数式接口来操作集合数据。

  • 在Spring应用中,同样可以利用Stream API对集合数据进行处理、过滤、转换等操作,使得代码更为简洁和可读。

以上就是函数式接口的整理,函数式接口是指只包含一个抽象方法的接口。

案例实践

案例1 MyFunctionalInterface 的简单使用

MyFunctionalInterface

@FunctionalInterface
interface MyFunctionalInterface {void myMethod();
}

FunctionalInterfaceTest

public class FunctionalInterfaceTest {public static void main(String[] args) {// 使用 Lambda 表达式创建 MyFunctionalInterface 的实例MyFunctionalInterface myFunctionalInterface = () -> System.out.println("Hello, Functional Interface!");// 调用接口的抽象方法myFunctionalInterface.myMethod();}
}

out

Hello, Functional Interface!

MyFunctionalInterface 使用 @FunctionalInterface 注解标识,接口中确保只有一个抽象方法。
在测试类的 main 方法中,我们使用 Lambda 表达式调用了函数式接口

案例2 Calculator

Calculator

@FunctionalInterface
public interface Calculator {int calculate(int a, int b);
}

FunctionalInterfaceTest

public class FunctionalInterfaceTest {public static void main(String[] args) {// 使用 lambda 表达式实现加法Calculator addition = (a, b) -> a + b;System.out.println("3 + 5 = " + addition.calculate(3, 5)); // 输出 8// 使用 lambda 表达式实现减法Calculator subtraction = (a, b) -> a - b;System.out.println("7 - 2 = " + subtraction.calculate(7, 2)); // 输出 5// 使用 lambda 表达式实现乘法Calculator multiplication = (a, b) -> a * b;System.out.println("4 * 6 = " + multiplication.calculate(4, 6)); // 输出 24}
}

out

3 + 5 = 8
7 - 2 = 5
4 * 6 = 24
  • 案例分析

Calculator 是一个函数式接口,只包含一个抽象方法 calculate
通过 lambda 表达式分别实现了加法、减法和乘法,并在 main 方法中进行了调用

案例3 使用java.util.function包中的函数式接口(Predicate/Function/Consumer)

  • 结合使用 PredicateFunctionConsumer 等接口来进行数据处理和过滤
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;public class FunctionalInterfaceTest {public static void main(String[] args) {List<String> names = Arrays.asList("John", "Doe", "Jane", "Smith", "Alice");// 使用 Predicate 过滤出长度大于等于4的字符串Predicate<String> filterPredicate = str -> str.length() >= 4;// 使用 Function 将字符串转换为大写Function<String, String> toUpperCaseFunction = String::toUpperCase;// 使用 Consumer 输出字符串Consumer<String> printConsumer = System.out::println;// 结合 Predicate、Function 和 Consumer 进行数据处理和输出names.stream().filter(filterPredicate).map(toUpperCaseFunction).forEach(printConsumer);}
}

out

JOHN
JANE
SMITH
ALICE
  • 案例分析

使用了 Predicate 进行字符串长度的过滤,然后使用 Function 将过滤后的字符串转换为大写,最后使用 Consumer 输出结果

X 参考文献

  • 理解函数式接口 @FunctionalInterface - Zhihu

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

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

相关文章

去中心化 AI:赋权还是混乱?

DeepSeek 如何在 AI 去中心化方面迈出了巨大的一步,以及为什么这比你想象的更重要Nadia Piet + AIxDESIGN & Archival Images of AI / Better Images of AI / AI Am Over It / CC-BY 4.02025 年 1 月 27 日星期一,DeepSeek —— 一家几乎凭空冒出来的中国初创公司 —— 发…

SmolLM2:多阶段训练策略优化和高质量数据集,小型语言模型同样可以实现卓越的性能表现

SmolLM2 采用创新的四阶段训练策略,在仅使用 1.7B 参数的情况下,成功挑战了大型语言模型的性能边界:在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B 近 6 个百分点 数学推理能力(GSM8K、MATH)优于 Llama3.2-1B 在代码生成和文本重写任务中展现出色表现 支持 8K tokens 的长文本处…

2025.2.23 (java的学习)

。。。昨天星期六一整天都没学习。。做了一个哆啦a梦。✌附一个目前弄的哆啦a梦全家桶吧。

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1:先旋转再平移 p_cam = T_car2Cam * p_car + T_car2Cam 需要注意的是,这里的平移矩阵T_car2Cam是车身坐…

8-2 MySQL 索引的设计原则(超详细说明讲解)

8-2 MySQL 索引的设计原则(超详细说明讲解) @目录8-2 MySQL 索引的设计原则(超详细说明讲解)1. 测试数据准备2. 哪些情况适合创建索引2.1 字段的数值有唯一性的限制2.2 频繁作为 WHERE 查询条件的字段2.3 经常 GROUP BY 和 ORDER BY 的列2.4 UPDATE、DELETE 的 中的WHERE 条件列…

北京时间同步

本地时间与北京时间 同步 参考:https://blog.csdn.net/qq_46092061/article/details/128748789 本地显示秒数while True:current_time = time.strftime("%H:%M:%S")if current_time >= "19:59:59":print("start")breaktime.sleep(0.5) # 减…

客流统计自动识别摄像头

客流统计自动识别摄像头提供了重要的决策依据。通过分析客流数据,商家可以了解顾客的消费习惯与高峰时段,从而优化营业时间、调整商品布局和促销策略。例如,如果某个时间段内顾客数量明显增加,商家可以考虑在此时推出促销活动,以吸引更多消费者。此外,通过长期的数据积累…

老人摔倒自动监控摄像头

老人摔倒自动监控摄像头通过智能识别技术,可以实时监测到老年人的活动状态。一旦系统检测到异常情况,比如老人摔倒,它会立即向家庭成员或护理人员发送警报。这种及时性大大提高了救助的效率,使得老人能够在最短时间内得到帮助。此外,一些先进的监控系统还配备了语音通话功…

在Odoo18.0中使用韵达速递

本文给大家带来的的是odoo与韵达速递的免费对接方案。 注册韵达开放平台 想要使用韵达速递,首先我们就需要注册一个韵达开放平台的账号,并创建一个开放平台应用。 创建完应用之后,我们需要以下4个参数:AppKey: 应用的key AppSecret: 应用的密钥 PartnerId: 韵达网点分配的…

积水自动监控摄像头

积水自动监控摄像头主要通过安装在关键路段、排水口和易积水区域的摄像头,对降雨和积水情况进行实时监控。这些摄像头配备了先进的图像识别技术,能够自动识别地面是否存在积水,并及时将数据传输到城市管理中心。一旦监测到积水情况,系统会立即发出警报,提醒相关部门迅速采…

清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!

前言 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单。该份教程旨在通过AI技术重构传统科研模式,提升研究效率与智能化水平。DeepSeek访问地址:https://chat.deepseek.com 清华大学推出的 DeepSeek 从入门到精通(104页)免费教程! 清华大学推出第二…

读DAMA数据管理知识体系指南02数据管理(下)

数据管理涵盖数据优化、元数据管理、多角度思考、生命周期管理、风险管理、领导力及战略制定,需确保数据质量、安全并降低风险,利用DAMA框架等指导数据管理实践。1. 数据优化计划 1.1. 数据也许被视为独立于业务流程存在 1.2. 业务流程与支持它们的技术之间的关系 1.3. 系统的…