Java 中的 Function:让转换逻辑更灵活
文章目录
- 1. Function 基础:简化转换逻辑
- 2. 组合 Function:实现多步转换
- 3. 配合 Stream 使用:简化数据转换
- 4. 自定义 Function,封装复杂转换
- 5. 使用 identity() 提供默认转换
- 6. 结合 Optional,实现动态数据转换
- 7. 用于工厂模式:实现动态对象创建
- 8. 使用 apply() 配合缓存机制,减少重复计算
- 9. Function 在策略模式中的应用
- 总结:
- 推荐阅读文章
Function<T, R>
是 Java 中一个重要的函数式接口,适用于将一个输入转换为一个输出的场景。通过
Function
,我们可以将复杂的转换逻辑抽象化,提升代码的灵活性和可读性。今天,让我们探讨
Function
在开发中的妙用,让代码更简洁、模块化!
1. Function 基础:简化转换逻辑
Function
的核心方法是 apply(T t)
,用于将输入转换为输出。举个简单例子,假设我们要将一个整数转换为其字符串表示:
Function<Integer, String> intToString = Object::toString;
System.out.println(intToString.apply(123)); // 输出: "123"
这种方式让代码更加直观,Function
可以轻松传递和复用,避免在代码中写重复的转换逻辑。
2. 组合 Function:实现多步转换
Java 的 Function
支持链式组合,通过 andThen()
和 compose()
可以将多个 Function
组合在一起。例如,将一个数字转换为字符串,然后再获取其长度:
Function<Integer, String> intToString = Object::toString;
Function<String, Integer> stringLength = String::length;Function<Integer, Integer> lengthOfIntString = intToString.andThen(stringLength);
System.out.println(lengthOfIntString.apply(12345)); // 输出: 5
通过 andThen()
,我们可以将多个步骤串联成一个操作,逻辑清晰且便于扩展。
3. 配合 Stream 使用:简化数据转换
Function
常用于 Stream
中的数据转换。假设我们有一个包含多个用户姓名的列表,需要将它们都转换为大写字母:
List<String> names = List.of("john", "jane", "alice");
List<String> upperNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(upperNames); // 输出: [JOHN, JANE, ALICE]
通过 map()
方法和 Function
配合,我们可以轻松实现对集合中每个元素的转换,代码简洁直观。
4. 自定义 Function,封装复杂转换
在实际开发中,转换逻辑往往比较复杂,Function
使我们可以将这些逻辑封装起来,便于在多个地方复用。假设我们有一个业务需求:将员工对象转换为显示的描述信息:
Function<Employee, String> employeeDescription = emp -> "Name: " + emp.getName() + ", Age: " + emp.getAge();
通过这种方式,我们可以将转换逻辑封装在 Function
中,使得代码更加简洁,同时可以在其他地方复用这个 Function
。
5. 使用 identity() 提供默认转换
Function.identity()
是一个常用的辅助方法,用于表示“原样返回”转换。在一些需要默认操作的场景中非常有用,例如数据处理时保留原值:
Function<String, String> identityFunction = Function.identity();
System.out.println(identityFunction.apply("Hello")); // 输出: Hello
identity()
提供了一种默认转换,避免重复定义相同逻辑,代码更具一致性。
6. 结合 Optional,实现动态数据转换
Function
还可以与 Optional
搭配使用,实现更灵活的数据转换。比如,判断一个字符串是否为 null
,如果不为空则转换为大写字母:
Optional<String> name = Optional.of("john");
String upperName = name.map(String::toUpperCase).orElse("Default");
System.out.println(upperName); // 输出: JOHN
通过 map()
和 Function
,我们可以在 Optional
中动态应用转换逻辑,避免传统的 if-else
判断。
7. 用于工厂模式:实现动态对象创建
Function
也常用于工厂模式中,通过参数化创建不同对象。例如在电商系统中,我们可以根据产品类型创建相应的产品实例:
Map<String, Function<String, Product>> productFactories = Map.of("book", Book::new,"laptop", Laptop::new
);Product product = productFactories.get("book").apply("Java Programming");
这种方式使代码结构更加灵活,便于动态创建不同类型的对象。
8. 使用 apply() 配合缓存机制,减少重复计算
在某些高性能场景下,可以结合 Function
和缓存机制,避免重复计算。例如在处理大量数据时缓存转换结果:
Function<String, Integer> cachedLength = new HashMap<String, Integer>()::computeIfAbsent;
int length = cachedLength.apply("hello", String::length);
System.out.println(length); // 输出: 5
利用 apply()
配合缓存机制,能显著提升性能,避免重复的转换操作。
9. Function 在策略模式中的应用
Function
也可以用于策略模式的实现。例如,根据不同的用户类型应用不同的折扣策略:
Map<String, Function<Double, Double>> discountStrategies = Map.of("VIP", price -> price * 0.8,"Regular", price -> price * 0.9
);double finalPrice = discountStrategies.get("VIP").apply(100.0);
System.out.println(finalPrice); // 输出: 80.0
这种方式让我们能够灵活地根据条件动态选择不同的策略,实现了策略模式。
总结:
Function
在 Java 中为数据转换提供了便捷、灵活的解决方案。无论是简单的类型转换、组合多步操作、封装复杂逻辑还是实现工厂模式和策略模式,Function
都可以帮助我们编写更加清晰、模块化的代码。通过熟练使用 Function
,我们可以极大简化代码结构、提升可读性,为项目增加灵活性。希望这些应用技巧能为你在开发中提供启发!
推荐阅读文章
- 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
- 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
- HTTP、HTTPS、Cookie 和 Session 之间的关系
- 什么是 Cookie?简单介绍与使用方法
- 什么是 Session?如何应用?
- 使用 Spring 框架构建 MVC 应用程序:初学者教程
- 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
- 如何理解应用 Java 多线程与并发编程?
- 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
- Java Spring 中常用的 @PostConstruct 注解使用总结
- 如何理解线程安全这个概念?
- 理解 Java 桥接方法
- Spring 整合嵌入式 Tomcat 容器
- Tomcat 如何加载 SpringMVC 组件
- “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
- “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
- 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
- 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
- 线程 vs 虚拟线程:深入理解及区别
- 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
- 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
- “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
- Java 中消除 If-else 技巧总结
- 线程池的核心参数配置(仅供参考)
- 【人工智能】聊聊Transformer,深度学习的一股清流(13)
- Java 枚举的几个常用技巧,你可以试着用用
相关文章:
Java 中的 Function:让转换逻辑更灵活
文章目录 1. Function 基础:简化转换逻辑2. 组合 Function:实现多步转换3. 配合 Stream 使用:简化数据转换4. 自定义 Function,封装复杂转换5. 使用 identity() 提供默认转换6. 结合 Optional,实现动态数据转换7. 用于…...

10. java基础知识(下)
文章目录 一、一带而过二、字符串类型String1. 简单了解2. 关于结束符\03. 自动类型转换与强制类型转换 三、API文档与import导包1. API文档2. import导包 四、java中的数组1. 创建2. 遍历3. 补充4. Arrays类① 简单介绍② 练习 五、方法的重载六、规范约束七、内容出处 一、一…...
kafka 在Linux安上的装部署
一、前言 Kafka 是一个分布式流处理平台,在大数据领域有着广泛的应用。在 Linux 系统上安装部署 Kafka 可以为我们搭建高效的数据处理环境。本教程将详细介绍在 Linux 中安装和部署 Kafka 的步骤。 二、准备工作 2.1 系统要求 确保你的 Linux 系统已经安装并配置…...
kill-start系统进程的研究
kill/start系统进程的研究 声明:内容的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 目录 kill/start系统进程的研究Windows系统进程简介特点系统进程 tas…...
【系统架构设计师】2024年下半年真题论文: 论面向服务的架构设计(包括解题思路和参考素材)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2024年下半年 试题1)解题思路论文素材参考面向服务的架构(SOA)概念和特征面向服务的架构关键技术面向服务的架构设计原则面向服务的架构设计案例分析SOA设计面临的挑战与应对策略真题题目(2024年下半…...

吴恩达深度学习笔记:序列模型(Sequence Models) 1.1-1.2
目录 第五门课 序列模型(Sequence Models)第一周 循环序列模型(Recurrent Neural Networks)1.1 为什么选择序列模型?(Why Sequence Models?)1.2 数学符号(Notation) 第五门课 序列模型(Sequenc…...

【Spring】Spring Web MVC基础入门~(含大量例子)
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:什么是Spring Web MVC 1:Servlet 2:总结 二:MVC …...

使用ThorUi
摘要: 官网 今天遇到一个老项目,使用的是ThorUi组件库!之前没有用过这组件库,所以记录一下不同框架是使用情况! ThorUI 是一个基于 Thorium 的 UI 框架,用于构建跨平台的桌面应用程序。如果你打算使用 Thor…...
【Promise】自定义promise
文章目录 1 定义整体结构2 Promise 构造函数的实现3 promise.then()与promise.catch()的实现4 Promise.resolve()与Promise.reject()的实现5 Promise.all与Promise.race()的实现6 Promise.resolveDelay()与Promise.rejectDelay()的实现 1 定义整体结构 /*自定义 Promise */ (f…...

Docker容器部署Windows系统教程
本章教程,使用Docker容器部署一个Windows操作系统容器。 一、拉取容器 dockurr/windows:latest二、运行容器 docker run -dit --name win11 -v $PWD:/share -v /opt/iso/win11.iso:/custom.iso -p 3389:3389 -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-tim…...
js id数组转字符串
在 JavaScript 中,将数组转换为字符串有几种常见的方法。每种方法都有其特定的用途和格式。以下是一些常用的方法: 1. Array.prototype.join(separator) join 方法将数组的所有元素连接成一个字符串,并使用指定的分隔符(默认为逗…...

如何在 Android 上增加 SELinux 权限
SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)机制,它为 Android 系统提供了额外的安全层。通过 SELinux,系统管理员可以定义细粒度的安全策略,限制进程对文件、网络和其他资源的访…...

MySQL:数据类型建表
问题:我想建一个名为create和database的库可以吗? 如果按照一般的类型来建带有关键字的库 就会出现报错 如果我们这样写的话:关键词 ,则会建库成功。 选择要进行操作的数据库 use数据库 判断选择的库是否成功 删除数据库 drop…...

Linux:版本控制器git的简单使用+gdb/cgdb调试器的使用
一,版本控制器git 1.1概念 为了能够更方便我们管理不同版本的文件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个文件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个…...

【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 目录 问题概述 原因 解决方案 解决方法 潜在问题修改 最终效果呈现 额外内容 管理员界面路由配置 WebStorm背景更换 法一: 法二: 问题概…...

力扣力扣力:91.解码方法
91. 解码方法 - 力扣(LeetCode) 在完成动态规划入门之后,我们先整一个中档题,也是前面简单题的变体。 分析思路: 在拿到最终结果之前,我们应该明确什么样的数字序列能够解码。 规则1:由于只有…...

一些面试题总结(二)
21、TCP的四次挥手? 在断开TCP连接时,需要通过四次挥手来断开,过程是: (1)客户端向服务端发送FIN1和序列号SEQx的数据包,用来关闭客户端到服务端的数据传送。然后客户端进入 FIN-WAIT-1 状态。 (2)服务端接收FIN后,…...
Hive-testbench套件使用文档
Hive-testbench套件使用文档 hive-testbench 是hortonworks的一个开源项目,用于测试和基准测试 Apache Hive 的工具集。它提供了一系列的测试数据集和查询样例,用于评估和比较 Hive 在不同配置和环境下的性能。hive-testbench 的主要目标是模拟真实的大规模数据集和复杂查询…...

大数据新视界 -- 大数据大厂之 Impala 性能优化:新技术融合的无限可能(下)(12/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Python | Leetcode Python题解之第540题有序数组中的单一元素
题目: 题解: class Solution:def singleNonDuplicate(self, nums: List[int]) -> int:low, high 0, len(nums) - 1while low < high:mid (low high) // 2mid - mid & 1if nums[mid] nums[mid 1]:low mid 2else:high midreturn nums[l…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...