一、理论说明

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 表达式,保持代码的可维护性。

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

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

相关文章

【python代码】一些小实验

目录 1. 测试Resnet50 ONNX模型的推理速度 1. 测试Resnet50 ONNX模型的推理速度 ############################### # 导出resnet50 模型 # 测试onnx模型推理 cpu 和 GPU 的对比 ###############################import time import numpy as np import onnxruntime as ort im…

5.Java 面向对象编程入门:类与对象的创建和使用​

在现实生活中&#xff0c;我们常常会接触到各种各样的对象&#xff0c;比如一辆汽车、一个学生、一部手机等。这些对象都具有各自的属性和行为。例如&#xff0c;汽车有颜色、品牌、型号等属性&#xff0c;还有启动、加速、刹车等行为&#xff1b;学生有姓名、年龄、学号等属性…

从开发者角度看数据库架构进化史:JDBC - 中间件 - TiDB

作者&#xff1a; Lucien-卢西恩 原文来源&#xff1a; https://tidb.net/blog/e7034d1b Java 应用开发技术发展历程 在业务开发早期&#xff0c;用 Java 借助 JDBC 进行数据库操作&#xff0c;虽能实现基本交互&#xff0c;但需手动管理连接、编写大量 SQL 及处理结果集&a…

工业智能网关建立烤漆设备故障预警及远程诊断系统

一、项目背景 烤漆房是汽车、机械、家具等工业领域广泛应用的设备&#xff0c;主要用于产品的表面涂装。传统的烤漆房控制柜采用本地控制方式&#xff0c;操作人员需在现场进行参数设置和设备控制&#xff0c;且存在设备智能化程度低、数据孤岛、设备维护成本高以及依靠传统人…

故障率预测:基于LSTM的GPU集群硬件健康监测系统(附Prometheus监控模板)

一、GPU集群健康监测的挑战与价值 在大规模深度学习训练场景下&#xff0c;GPU集群的硬件故障率显著高于传统计算设备。根据2023年MLCommons统计&#xff0c;配备8卡A100的服务器平均故障间隔时间&#xff08;MTBF&#xff09;仅为1426小时&#xff0c;其中显存故障占比达38%&…

Vue 样式不一致问题全面分析与解决方案

文章目录 1. 问题概述1.1 问题表现1.2 问题影响 2. 根本原因分析2.1 Vue 的渲染机制与样式加载时机2.2 Scoped CSS 的工作原理2.3 CSS 模块化与作用域隔离2.4 样式加载顺序问题2.5 热重载(HMR)与样式更新 3. 解决方案3.1 确保样式加载顺序3.1.1 预加载关键 CSS3.1.2 控制全局样…

[免费]微信小程序宠物医院管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序宠物医院管理系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序宠物医院管理系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibi…

测试总结(一)

一、测试流程 参与需求评审-制定测试计划-编写测试用例-用例评审-冒烟测试-测试执行-缺陷管理-预发验收测试-发布线上-线上回归-线上观察-项目总结 二、测试用例设计方法 等价类划分&#xff08;处理有效/无效输入&#xff09; 边界值分析&#xff08;临界值测试&#xff09…

SAP-ABAP:ABAP异常处理与SAP现代技术融合—— 面向云原生、微服务与低代码场景的创新实践

专题三&#xff1a;ABAP异常处理与SAP现代技术融合 —— 面向云原生、微服务与低代码场景的创新实践 一、SAP技术演进与异常处理的挑战 随着SAP技术栈向云端、微服务化和低代码方向演进&#xff0c;异常处理面临新场景&#xff1a; Fiori UX敏感度&#xff1a;用户期望前端友…

DC-DC电路的自举电容电路原理

在以往的电子产品设计中&#xff0c;我们经常会选型 DCDC 芯片&#xff0c;在选型过程中经常遇到有些DC-DC电路中需要用到自举电容&#xff0c;本文主要分析自举电容在DC-DC电路中的原理。 无论同步或者异步整流&#xff0c;经常会看到一个自举电容&#xff0c;常并联在DC-DC的…

android studio 开启无线调试

1、在工具的模拟器点击下后&#xff0c;会出现下面菜单&#xff1a; 选择Pair Devices Using Wi-Fi 发现一直在转圈&#xff0c;并不会连接上&#xff0c;之前在android12的时候&#xff0c;发现一连就上了&#xff0c;现在换成了android14&#xff0c;连不上了。 2、选择用命令…

Go基础语法与控制结构

Go基础语法与控制结构 1. 环境配置与Hello World&#xff08;扩展&#xff09; 安装指南 # 验证安装成功 $ go version # 设置模块代理&#xff08;中国用户推荐&#xff09; $ go env -w GOPROXYhttps://goproxy.cn,direct程序解剖 package main // 程序入口包声明import…

QGIS新手教程:两种方法创建点图层(手动添加 + 表格导入),支持经纬度定位与查找

&#x1f30d;QGIS新手教程&#xff1a;两种方法创建点图层&#xff08;手动添加 表格导入&#xff09;&#xff0c;支持经纬度定位与查找 本文将手把手教你在 QGIS 中通过两种方法创建点图层&#xff0c;并结合经纬度定位、拾取坐标、查找属性等功能&#xff0c;快速掌握从地…

Doris ClickHouse Greenplum 对比

1. 核心架构对比 Doris &#xff08;https://doris.apache.org/&#xff09; MPP架构 列式存储支持实时更新&#xff08;Unique Key模型&#xff09;向量化执行引擎兼容MySQL协议 ClickHouse &#xff08;https://clickhouse.com/&#xff09; 分布式列式存储MergeTree存储引…

基于python,html,echart,php,mysql,在线实时监控入侵检测系统

详细视频:【基于python,html,echart,php,mysql,在线实时监控入侵检测系统&#xff0c;需要的可联系介绍都在所有图片中。包远程部署安装。-哔哩哔哩】 https://b23.tv/KHxmE8k

基于51单片机智能垃圾桶—红外感应自动开关

基于51单片机智能垃圾桶 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.ULN2003驱动步进电机控制打开关闭垃圾桶&#xff1b; 2.一个红外对管检测有没有人&#xff0c;一个红外对管…

自动涂胶机设计及其在工业生产中的应用研究

摘要 本文详细探讨了自动涂胶机的设计原理、关键技术和应用前景。随着工业自动化水平的不断提高&#xff0c;自动涂胶机在制造业中的应用日益广泛。文章首先分析了自动涂胶机的基本工作原理&#xff0c;然后深入研究了其机械结构设计、控制系统设计和视觉定位系统等关键技术。…

SQL 语言

SQL概述与数据库定义 SQL的基本组成 1、数据定义语言。SQL DDL提供定义关系模式和视图、删除关系和视图、修改关系模式的命令。 2、交互式数据操纵语言。SQL DML提供查询、插入、删除和修改的命令。 3、事务控制。SQL提供定义事务开始和结束的命令。 4、嵌入式SQL和动态SQL。用…

深度剖析ZooKeeper

1. ZooKeeper架构总览 ZooKeeper 是一个分布式协调服务&#xff0c;广泛用于分布式系统中的配置管理、命名服务、分布式锁和领导选举等场景。以下是对 ZooKeeper 架构、通信机制、容错处理、数据一致性与可靠性等方面的详细剖析。 一、ZooKeeper 主从集群 ZooKeeper 采用 主从…

K8S-statefulset-mysql-ha

需求 实现一个HA mysql&#xff0c;包括1个master&#xff0c;2个slave。在K8S上已statefulset部署。 mysql HA原理 略 K8S环境需要解决的问题 1、由于使用同一个statefulset配置&#xff0c;因此需要考虑master和slave使用不同的cnf文件。 2、不同pod之间文件的传输 3、…