JavaFunction的使用

server/2025/3/3 19:30:01/

一、基础概念与核心方法

​定义与作用​
Function<T, R> 是一个函数式接口,接收类型为 T 的输入参数,返回类型为 R 的结果。其核心方法为 apply(T t)。例如,将字符串转换为整数长度:

java
Function<String, Integer> lengthFunction = s -> s.length();
System.out.println(lengthFunction.apply(“Java”)); // 输出:4
​链式组合方法​

andThen():先执行当前函数,再将结果传递给后续函数。
compose():先执行参数中的函数,再将结果传递给当前函数。
示例:数学运算组合:
java
Function<Integer, Integer> multiplyByTwo = x -> x * 2;
Function<Integer, Integer> addThree = x -> x + 3;
// 先乘2再加3
Function<Integer, Integer> combined1 = multiplyByTwo.andThen(addThree);
// 先加3再乘2
Function<Integer, Integer> combined2 = addThree.compose(multiplyByTwo);
System.out.println(combined1.apply(5)); // 输出:13
System.out.println(combined2.apply(5)); // 输出:16
​异常处理​
使用 orElseThrow() 处理可能的空值或异常情况:

java
Function<String, Integer> parseFunction = s -> Integer.parseInt(s);
String input = “123”;
int result = parseFunction.apply(input).orElseThrow(() -> new IllegalArgumentException(“无效输入”));

二、实际应用场景

​数据转换​
在集合操作中,Function 可与 Stream API 结合,简化数据转换逻辑。例如,将字符串列表转为整数列表:

java
List numbers = Arrays.asList(“1”, “2”, “3”);
List intList = numbers.stream()
.map(Integer::parseInt)
.collect(Collectors.toList());
​业务逻辑封装​
替代冗长的条件分支,例如根据商品类型计算折扣价:

java
Function<Product, BigDecimal> discountFunction = product -> {
switch (product.getType()) {
case “A”: return product.getPrice().multiply(new BigDecimal(“0.9”));
case “B”: return product.getPrice().multiply(new BigDecimal(“0.8”));
default: return product.getPrice();
}
};
BigDecimal finalPrice = discountFunction.apply(product);
​动态组合操作​
在数据处理流水线中,灵活组合多个函数:

java
Function<String, String> trim = String::trim;
Function<String, String> toUpper = String::toUpperCase;
Function<String, String> addPrefix = s -> “Result: " + s;
String output = trim.andThen(toUpper).andThen(addPrefix).apply(” hello ");
System.out.println(output); // 输出:Result: HELLO

三、与 JDK 新特性的结合

​模式匹配(Java 17+)​​
在 switch 表达式中结合 Function,简化类型判断逻辑:

java
Function<Object, String> formatter = obj -> switch (obj) {
case Integer i -> "Integer: " + i;
case String s -> "String: " + s;
default -> “Unknown”;
};
System.out.println(formatter.apply(10)); // 输出:Integer: 10
​记录类(Record)​​
通过 Function 转换记录类对象,例如提取字段:

java
record Person(String name, int age) {}
Function<Person, String> getName = Person::name;
System.out.println(getName.apply(new Person(“Alice”, 30))); // 输出:Alice

四、最佳实践建议

​避免过度嵌套:链式调用过长时,可拆分为多个中间函数。
​优先使用方法引用:如 String::length 替代 s -> s.length(),提升可读性。
​结合 Optional:处理可能为空的输入,例如 Function.andThen(Optional::ofNullable)。
通过上述方法,Function 能有效减少冗余代码(如消除 80% 的 if-else 分支),提升代码的模块化和可维护性。实践中可根据具体场景选择组合方式,并探索与 Lambda、Stream 等特性的深度结合。


http://www.ppmy.cn/server/172150.html

相关文章

【Blender】三、材质篇--3.4 凹凸感和置换形变

0 00:00:03,020 --> 00:00:10,260 本节课呢 我们来学习如何给材质增加凹凸感 还有增加一些细节的行变 我们来去看看这种材质到底是怎么做出来的 1 00:00:10,530 --> 00:00:17,010 这个是本节课程的主要内容和时间戳 那我们现在就开始吧 首先 我们打开你的blender 我们…

【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)

前言 华为电脑管家是一款专为华为电脑用户设计的综合管理软件&#xff0c;提供了多种实用功能&#xff0c;旨在优化电脑性能并提升用户体验。其拥有以下特色功能&#xff1a; 互传功能&#xff1a; 快速传输&#xff1a;华为电脑管家支持与华为手机之间的快速文件传输。用户可…

技术架构和工程架构区别

技术架构 技术架构‌是对某一技术问题解决方案的结构化描述&#xff0c;包括组件结构及其交互关系。它涵盖部署方案、存储方案、缓存方案、日志方案等多个方面&#xff0c;旨在通过组织人员和技术&#xff0c;以最低的成本满足需求和应对变化&#xff0c;保障软件的稳定高效运…

【愚公系列】《Python网络爬虫从入门到精通》039-MySQL数据库

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

【金融量化】解读量化投资回测指标

量化投资回测指标全解析&#xff1a;理解策略表现的关键 在量化投资中。通过回测&#xff0c;可以了解策略在历史数据上的表现&#xff0c;并通过一系列指标来衡量其优劣。 一个优秀的量化策略通常具有以下特点&#xff1a; 高策略收益和年化收益。高Alpha和低Beta&#xff0…

PDF图形识别:一键框选,快速计数,开启数字化图形处理新时代

PDF图形识别技术基于先进的图像识别算法和人工智能技术。当对PDF文件进行处理时&#xff0c;首先会将PDF中的图形转化为计算机可识别的数字图像格式。接着&#xff0c;算法通过对图像中线条、形状、颜色等特征的分析&#xff0c;来识别图形的类别和属性。例如&#xff0c;对于工…

基于Leaflet和SpringBoot的全球国家综合检索WebGIS可视化

目录 前言 一、Java后台程序设计 1、业务层设计 2、控制层设计 二、WebGIS可视化实现 1、侧边栏展示 ?2、空间边界信息展示 三、标注成果展示 1、面积最大的国家 2、国土面积最小的国家 3、海拔最低的国家 4、最大的群岛国家? 四、总结 前言 在前面的博文中&am…

DeepSeek开源周,第五弹再次来袭,3FS

Fire-Flyer 文件系统&#xff08;3FS&#xff09;总结&#xff1a; 一、核心特点 3FS 是一个专为 AI 训练和推理工作负载设计的高性能分布式文件系统&#xff0c;利用现代 SSD 和 RDMA 网络&#xff0c;提供共享存储层&#xff0c;简化分布式应用开发。其主要特点包括&#xf…