当前位置: 首页 > article >正文

Java 函数式接口(Functional Interface)

一、理论说明

1. 函数式接口的定义

Java 函数式接口是一种特殊的接口,它只包含一个抽象方法(Single Abstract Method, SAM),但可以包含多个默认方法或静态方法。函数式接口是 Java 8 引入 Lambda 表达式的基础,通过函数式接口可以将行为作为参数传递,实现更简洁、灵活的代码。

2. 核心特性

  • @FunctionalInterface 注解:可选注解,用于标记接口为函数式接口,编译器会检查该接口是否只有一个抽象方法。
  • 与 Lambda 表达式的关系:Lambda 表达式是函数式接口的实例,可直接赋值给函数式接口类型的变量。
  • 内置函数式接口:Java 8 在 java.util.function 包中提供了一系列通用的函数式接口,如 PredicateFunctionConsumer 等。

二、内置函数式接口

Java 8 提供了四大核心函数式接口,覆盖了常见的函数式编程场景:

1. Predicate<T>

接收一个参数,返回布尔值,用于判断条件。

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);
}// 使用示例
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // 输出: true

2. Function<T, R>

接收一个参数,返回另一个类型的结果,用于类型转换。

@FunctionalInterface
public interface Function<T, R> {R apply(T t);
}// 使用示例
Function<String, Integer> strLength = s -> s.length();
System.out.println(strLength.apply("hello")); // 输出: 5

3. Consumer<T>

接收一个参数,不返回结果,用于消费数据。

@FunctionalInterface
public interface Consumer<T> {void accept(T t);
}// 使用示例
Consumer<String> printer = s -> System.out.println(s);
printer.accept("Hello, World!"); // 输出: Hello, World!

4. Supplier<T>

不接收参数,返回一个结果,用于提供数据。

@FunctionalInterface
public interface Supplier<T> {T get();
}// 使用示例
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println(randomSupplier.get()); // 输出随机数

三、自定义函数式接口

可以通过 @FunctionalInterface 注解定义自己的函数式接口:

@FunctionalInterface
public interface Calculator {int calculate(int a, int b); // 唯一的抽象方法// 默认方法(非抽象)default void printResult(int result) {System.out.println("计算结果: " + result);}
}// 使用 Lambda 表达式实现
Calculator adder = (a, b) -> a + b;
Calculator subtractor = (a, b) -> a - b;System.out.println(adder.calculate(5, 3)); // 输出: 8
adder.printResult(10); // 输出: 计算结果: 10

四、方法引用(Method Reference)

方法引用是 Lambda 表达式的一种简化形式,用于直接引用已存在的方法。

1. 静态方法引用

// Lambda 表达式
Function<String, Integer> parseInt = s -> Integer.parseInt(s);// 方法引用
Function<String, Integer> parseIntRef = Integer::parseInt;

2. 实例方法引用

// Lambda 表达式
Consumer<String> printer = s -> System.out.println(s);// 方法引用
Consumer<String> printerRef = System.out::println;

3. 构造方法引用

// Lambda 表达式
Supplier<List<String>> listSupplier = () -> new ArrayList<>();// 方法引用
Supplier<List<String>> listSupplierRef = ArrayList::new;

五、应用实例

1. 集合过滤(Predicate)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FilterExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 过滤偶数List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0) // 使用 Predicate.collect(Collectors.toList());System.out.println(evenNumbers); // 输出: [2, 4, 6]}
}

2. 数据转换(Function)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class MapExample {public static void main(String[] args) {List<String> words = Arrays.asList("hello", "world");// 转换为大写List<String> upperCaseWords = words.stream().map(String::toUpperCase) // 使用 Function.collect(Collectors.toList());System.out.println(upperCaseWords); // 输出: [HELLO, WORLD]}
}

3. 事件处理

@FunctionalInterface
public interface ClickListener {void onClick(String event);
}public class Button {private ClickListener listener;public void setOnClickListener(ClickListener listener) {this.listener = listener;}public void simulateClick() {if (listener != null) {listener.onClick("Button clicked");}}
}// 使用 Lambda 表达式处理事件
Button button = new Button();
button.setOnClickListener(event -> System.out.println("处理事件: " + event));
button.simulateClick(); // 输出: 处理事件: Button clicked

六、面试题

题目:

答案:

七、自我总结

函数式接口是 Java 函数式编程的核心,它结合 Lambda 表达式和方法引用,使代码更简洁、更具表现力。关键要点包括:

  1. 定义规则:函数式接口只能有一个抽象方法,但可以包含默认方法和静态方法。
  2. 内置接口PredicateFunctionConsumer 和 Supplier 覆盖了常见场景。
  3. 方法引用:简化 Lambda 表达式,提高代码可读性。
  4. 与 Stream API 结合:在集合处理中发挥强大作用。

在实际开发中,函数式接口常用于回调、事件处理、集合操作等场景,能够有效减少样板代码,提升开发效率。但需注意避免过度使用复杂的 Lambda 表达式,保持代码的可维护性。

相关文章:

Java 函数式接口(Functional Interface)

一、理论说明 1. 函数式接口的定义 Java 函数式接口是一种特殊的接口&#xff0c;它只包含一个抽象方法&#xff08;Single Abstract Method, SAM&#xff09;&#xff0c;但可以包含多个默认方法或静态方法。函数式接口是 Java 8 引入 Lambda 表达式的基础&#xff0c;通过函…...

分布式锁总结

文章目录 分布式锁什么是分布式锁&#xff1f;分布式锁的实现方式基于数据库(mysql)实现基于缓存(redis)多实例并发访问问题演示项目代码(使用redis)配置nginx.confjmeter压测复现问题并发是1&#xff0c;即不产生并发问题并发30测试,产生并发问题(虽然单实例是synchronized&am…...

使用MybatisPlus实现sql日志打印优化

背景&#xff1a; 在排查无忧行后台服务日志时&#xff0c;一个请求可能会包含多个执行的sql&#xff0c;经常会遇到SQL语句与对应参数不连续显示&#xff0c;或者参数较多需要逐个匹配的情况。这种情况下&#xff0c;如果需要还原完整SQL语句就会比较耗时。因此&#xff0c;我…...

springboot中redis的事务的研究

redis的事务类似于队列操作&#xff0c;执行过程分为三步&#xff1a; 开启事务入队操作执行事务 使用到的几个命令如下&#xff1a; 命令说明multi开启一个事务exec事务提交discard事务回滚watch监听key(s)&#xff1a;当监听一个key(s)时&#xff0c;如果在本次事务提交之…...

为什么我输入对了密码,还是不能用 su 切换到 root?

“为什么我输入对了密码&#xff0c;还是不能用 su 切换到 root&#xff1f;” 其实这背后可能不是“密码错了”&#xff0c;而是系统不允许你用 su 切 root&#xff0c;即使密码对了。 &#x1f447; 以下是最常见的几个真正原因&#xff1a; ❌ 1. Root 用户没有设置密码&…...

client.chat.completions.create方法参数详解

response client.chat.completions.create(model"gpt-3.5-turbo", # 必需参数messages[], # 必需参数temperature1.0, # 可选参数max_tokensNone, # 可选参数top_p1.0, # 可选参数frequency_penalty0.0, # 可选参数presenc…...

量子计算与云计算的融合:技术前沿与应用前景

目录 引言 量子计算基础 量子计算的基本原理 量子计算的优势与挑战 量子计算的发展阶段 云计算基础 云计算的基本概念 云计算的应用领域 云计算面临的挑战 量子计算与云计算的结合 量子云计算的概念与架构 量子云计算的服务模式 量子云计算的优势 量子云计算的发展…...

《企业级日志该怎么打?Java日志规范、分层设计与埋点实践》

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个Java开发中超级重要但又经常被忽视的话题——日志系统&#xff01;&#x1f4dd; 不管你是刚入门的小白&#xff0c;还是工作多年的老司机&#xff0c;日志都是我们每天都要打交道的"好朋友"。那么&#xff0c;如…...

python模块管理环境变量

概要 在 Python 应用中&#xff0c;为了将配置信息与代码分离、增强安全性并支持多环境&#xff08;开发、测试、生产&#xff09;运行&#xff0c;使用专门的模块来管理环境变量是最佳实践。常见工具包括&#xff1a; 标准库 os.environ&#xff1a;直接读取操作系统环境变量…...

【泛微系统】后端开发Action常用方法

后端开发Action常用方法 代码实例经验分享:代码实例 经验分享: 本文分享了后端开发中处理工作流Action的常用方法,主要包含以下内容:1) 获取工作流基础信息,如流程ID、节点ID、表单ID等;2) 操作请求信息,包括请求紧急程度、操作类型、用户信息等;3) 表单数据处理,展示…...

【算法】力扣体系分类

第一章 算法基础题型 1.1 排序算法题 1.1.1 冒泡排序相关题 冒泡排序是一种简单的排序算法&#xff0c;它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c…...

sql:如何查询一个数据表字段:Scrp 数据不为空?

在SQL中&#xff0c;要查询一个数据表中的字段 Scrp 不为空的记录&#xff0c;可以使用 IS NOT NULL 条件。以下是一个基本的SQL查询示例&#xff1a; SELECT * FROM your_table_name WHERE Scrp IS NOT NULL;在这个查询中&#xff0c;your_table_name 应该替换为你的实际数据…...

深入浅出人工智能:机器学习、深度学习、强化学习原理详解与对比!

各位朋友&#xff0c;大家好&#xff01;今天咱们聊聊人工智能领域里最火的“三剑客”&#xff1a;机器学习 (Machine Learning)、深度学习 (Deep Learning) 和 强化学习 (Reinforcement Learning)。 听起来是不是有点高大上&#xff1f; 别怕&#xff0c;我保证把它们讲得明明…...

索引下探(Index Condition Pushdown,简称ICP)

索引下探&#xff08;Index Condition Pushdown&#xff0c;简称ICP&#xff09;是一种数据库查询优化技术&#xff0c;常见于MySQL等关系型数据库中。 1. 核心概念 作用&#xff1a;将原本在服务器层执行的WHERE条件判断尽可能下推到存储引擎层执行。减少回表查询次数支持部…...

基于 ColBERT 框架的后交互 (late interaction) 模型速递:Reason-ModernColBERT

一、Reason-ModernColBERT 模型概述 Reason-ModernColBERT 是一种基于 ColBERT 框架的后交互 (late interaction) 模型&#xff0c;专为信息检索任务中的推理密集型场景设计。该模型在 reasonir-hq 数据集上进行训练&#xff0c;于 BRIGHT 基准测试中取得了极具竞争力的性能表…...

vector中reserve导致的析构函数问题

接上一节vector实现&#xff0c;解决杨辉三角问题时&#xff0c;我在最后调试的时候&#xff0c;发现return vv时&#xff0c;调用析构函数&#xff0c;到第四步时才析构含有14641的vector。我设置了一个全局变量i来记录。 初始为35&#xff1a; 当为39时&#xff0c;也就是第…...

微软开源多智能体自定义自动化工作流系统:构建企业级AI驱动的智能引擎

微软近期推出了一款开源解决方案加速器——Multi-Agent Custom Automation Engine Solution Accelerator,这是一个基于AI多智能体协作的自动化工作流系统。该系统通过指挥多个智能体(Agent)协同完成复杂任务,显著提升企业在数据处理、业务流程管理等场景中的效率与准确性。…...

关于vector、queue、list哪边是front、哪边是back,增加、删除元素操作

容器的 front、back 及操作方向 1.1vector&#xff08;动态数组&#xff09; 结构&#xff1a;连续内存块&#xff0c;支持快速随机访问。 操作方向&#xff1a; front&#xff1a;第一个元素&#xff08;索引 0&#xff09;。 back&#xff1a;最后一个元素&#xff08;索引…...

KubeVela入门到精通-K8S多集群交付

目录 1、介绍 2、部署 3、部署UI界面 4、御载 5、Velaux概念 6、OAM应用模型介绍 7、应用部署计划 8、系统架构 9、基础环境配置 9.1 创建项目 9.2 创建集群 9.3 创建交付目标 9.4 创建环境 9.5、创建服务测试 9.6、服务操作 10、插件、项目、权限管理 10.1 插…...

RocketMq的消息类型及代码案例

RocketMQ 提供了多种消息类型&#xff0c;以满足不同业务场景对 顺序性、事务性、时效性 的要求。其核心设计思想是通过解耦 “消息传递模式” 与 “业务逻辑”&#xff0c;实现高性能、高可靠的分布式通信。 一、主要类型包括 普通消息&#xff08;基础类型&#xff09;顺序…...

Eigen 直线拟合/曲线拟合/圆拟合/椭圆拟合

一、直线拟合 使用Eigen库进行直线拟合是数据分析和科学计算中的常见任务,主要通过最小二乘法实现。以下是关键实现方法和示例: 核心原理最小二乘法通过最小化点到直线距离的平方和来求解最优直线参数间接平差法是最小二乘法的具体实现形式,适用于直线拟合场景通过构建误差…...

安卓无障碍脚本开发全教程

文章目录 第一部分&#xff1a;无障碍服务基础1.1 无障碍服务概述核心功能&#xff1a; 1.2 基本原理与架构1.3 开发环境配置所需工具&#xff1a;关键依赖&#xff1a; 第二部分&#xff1a;创建基础无障碍服务2.1 服务声明配置2.2 服务配置文件关键属性说明&#xff1a; 2.3 …...

svn迁移到git保留记录和Python字符串格式化 f-string的进化历程

svn迁移到git保留记录 and Python字符串格式化(二&#xff09;&#xff1a; f-string的进化历程 在将项目从SVN迁移到Git时&#xff0c;保留完整的版本历史记录非常重要。下面是详细的步骤和工具&#xff0c;可以帮助你完成这一过程&#xff1a; 安装Git和SVN工具 首先&#…...

SOC-ESP32S3部分:10-GPIO中断按键中断实现

飞书文档https://x509p6c8to.feishu.cn/wiki/W4Wlw45P2izk5PkfXEaceMAunKg 学习了GPIO输入和输出功能后&#xff0c;参考示例工程&#xff0c;我们再来看看GPIO中断&#xff0c;IO中断的配置分为三步 配置中断触发类型安装中断服务注册中断回调函数 ESP32-S3的所有通用GPIO…...

【神经网络与深度学习】扩散模型之原理解释

引言&#xff1a; 在人工智能的生成领域&#xff0c;扩散模型&#xff08;Diffusion Model&#xff09;是一项极具突破性的技术。它不仅能够生成高质量的图像&#xff0c;还可以应用于音频、3D建模等领域。扩散模型的核心思想来源于物理扩散现象&#xff0c;其工作方式类似于从…...

语音合成之十六 语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案

语音合成&#xff08;TTS&#xff09;跳跃与重复问题的解析&#xff1a;成因、机制及解决方案 引言TTS中跳跃与重复问题的根本原因注意力机制的失效文本到语音的对齐挑战自回归&#xff08;AR&#xff09;TTS模型的固有挑战时长建模的重要性输入数据特征的影响 构建鲁棒性&…...

战略-2.1 -战略分析(PEST/五力模型/成功关键因素)

战略分析路径&#xff0c;先宏观&#xff08;PEST&#xff09;、再产业&#xff08;产品生命周期、五力模型、成功关键因素&#xff09;、再竞争对手分析、最后企业内部分析。 本文介绍&#xff1a;PEST、产品生命周期、五力模型、成功关键因素、产业内的战略群组 一、宏观环境…...

python第三方库安装错位

问题所在 今天在安装我的django库时&#xff0c;我的库安装到了python3.13版本。我本意是想安装到python3.11版本的。我的pycharm右下角也设置了python3.11 但是太可恶了&#xff0c;我在pycharm的项目终端执行安装命令的时候还是给我安装到了python3.13的位置。 解决方法 我…...

如何把vue项目部署在nginx上

1&#xff1a;在vscode中把vue项目打包会出现dist文件夹 按照图示内容即可把vue项目部署在nginx上...

Vue3集成Element Plus完整指南:从安装到主题定制下-实现后台管理系统框架搭建

本文将详细介绍如何使用 Vue 3 构建一个综合管理系统&#xff0c;包括路由配置、页面布局以及常用组件集成。 一、路由配置 首先&#xff0c;我们来看系统的路由配置&#xff0c;这是整个应用的基础架构&#xff1a; import {createRouter, createWebHistory} from vue-rout…...