Java Function 的妙用:化繁为简的魔法师!

server/2024/11/18 12:59:13/

Java Function 的妙用:化繁为简的魔法师!

在 Java 开发中,Function 是一个非常重要的函数式接口,它的存在让代码从繁琐走向简洁,从普通迈向优雅。今天,我们就来聊聊 Function 的那些“妙用”,以及它如何帮助开发者写出更简洁、更强大的代码。


一、什么是 Function?

Function 是 Java 8 中引入的一个函数式接口,定义在 java.util.function 包中。它接受一个输入参数,并返回一个结果。

核心方法

java">@FunctionalInterface
public interface Function<T, R> {R apply(T t);
}

换句话说:

  • 输入一个 T,输出一个 R
  • 它是数据“加工”的工具。

简单例子:

java">import java.util.function.Function;public class FunctionDemo {public static void main(String[] args) {Function<String, Integer> stringLength = str -> str.length();System.out.println(stringLength.apply("Hello, Function!")); // 输出 15}
}

二、Function 的常见妙用

1. 转换数据类型

很多时候,我们需要把一种类型的数据转换成另一种类型,比如将 String 转换成 Integer

java">Function<String, Integer> parseInt = Integer::parseInt;
System.out.println(parseInt.apply("123")); // 输出 123
再进一步:批量处理

配合 stream(),我们可以对列表中的数据批量转换。

java">import java.util.List;
import java.util.stream.Collectors;public class BulkProcessing {public static void main(String[] args) {List<String> numbers = List.of("1", "2", "3");List<Integer> result = numbers.stream().map(Integer::parseInt).collect(Collectors.toList());System.out.println(result); // 输出 [1, 2, 3]}
}

2. 组合函数

Function 提供了两个强大的方法:andThencompose,可以将多个函数组合起来,让代码逻辑更加清晰。

(1) andThen: 先执行当前函数,再执行参数中的函数
java">Function<Integer, Integer> multiplyBy2 = x -> x * 2;
Function<Integer, Integer> add3 = x -> x + 3;Function<Integer, Integer> combined = multiplyBy2.andThen(add3);
System.out.println(combined.apply(5)); // (5 * 2) + 3 = 13
(2) compose: 先执行参数中的函数,再执行当前函数
java">Function<Integer, Integer> combined2 = multiplyBy2.compose(add3);
System.out.println(combined2.apply(5)); // (5 + 3) * 2 = 16
(3) 实际应用场景:处理复杂数据

假设一个用户的年龄需要经过两个步骤处理:

  • 步骤 1:从 String 转成 Integer
  • 步骤 2:乘以系数 2。
java">Function<String, Integer> parseAndDouble = Integer::parseInt.andThen(age -> age * 2);
System.out.println(parseAndDouble.apply("20")); // 输出 40

3. 提取公共逻辑,减少代码重复

在实际开发中,我们常常遇到相似的逻辑,比如对一组数据进行校验或格式化。通过 Function,这些重复逻辑可以被抽象出来。

需求:对一组用户名字进行格式化

传统写法:

java">List<String> names = List.of(" ALICE ", " bOB", "CHARLIE ");
List<String> formattedNames = new ArrayList<>();
for (String name : names) {formattedNames.add(name.trim().toUpperCase());
}
System.out.println(formattedNames); // [ALICE, BOB, CHARLIE]

使用 Function 的写法:

java">Function<String, String> formatName = name -> name.trim().toUpperCase();
List<String> formattedNames = names.stream().map(formatName).collect(Collectors.toList());
System.out.println(formattedNames); // [ALICE, BOB, CHARLIE]
优点
  • 逻辑更简洁。
  • 格式化逻辑可以复用。

4. 实现策略模式

通过 Function,我们可以轻松实现策略模式,让代码逻辑更加灵活。

需求:根据不同的用户类型,计算不同的折扣
java">import java.util.Map;
import java.util.function.Function;public class StrategyPattern {public static void main(String[] args) {Map<String, Function<Double, Double>> discountStrategies = Map.of("VIP", price -> price * 0.8,"Regular", price -> price * 0.9,"Guest", price -> price);double price = 100.0;System.out.println("VIP: " + discountStrategies.get("VIP").apply(price));       // 80.0System.out.println("Regular: " + discountStrategies.get("Regular").apply(price)); // 90.0System.out.println("Guest: " + discountStrategies.get("Guest").apply(price));     // 100.0}
}
优点
  • 新增策略时,只需添加一条 Map 配置。
  • 逻辑清晰,易于扩展。

5. 延迟计算与缓存

Function 还可以用来实现一些简单的延迟计算或缓存逻辑。例如:

需求:计算数据并缓存结果
java">import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;public class CacheDemo {public static void main(String[] args) {Map<Integer, String> cache = new HashMap<>();Function<Integer, String> fetchData = id -> cache.computeIfAbsent(id, key -> {System.out.println("Fetching data for " + key);return "Data for ID: " + key;});System.out.println(fetchData.apply(1)); // 第一次计算System.out.println(fetchData.apply(1)); // 从缓存中获取}
}

输出:

Fetching data for 1
Data for ID: 1
Data for ID: 1
优点
  • 避免重复计算。
  • 配合 computeIfAbsent,逻辑更简洁。

三、总结

Function 是 Java 中一个非常灵活的工具,可以用来简化代码逻辑、提高代码复用性。以下是一些最佳实践:

使用场景回顾

  1. 数据转换:将一种类型的数据轻松转换为另一种类型。
  2. 函数组合:通过 andThencompose 构建复杂逻辑。
  3. 公共逻辑抽取:减少代码重复。
  4. 策略模式:让代码逻辑灵活易扩展。
  5. 延迟计算与缓存:高效管理数据处理。

开发者金句

用好 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 枚举的几个常用技巧,你可以试着用用

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

相关文章

SRP 实现 Cook-Torrance BRDF

写的很乱&#xff01; BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff09;全称双向反射分布函数。辐射量单位非常多&#xff0c;这里为方便直观理解&#xff0c;会用非常不严谨的光照强度来解释说明。 BRDF光照模型&#xff0c;上反射率公式&#…

nodejs+mysql+vue3 应用实例剖析

文章目录 node.js vue3 mysql 应用后端实现&#xff08;koa部分&#xff09;1. 项目初始化与依赖安装2. 目录结构3. config/db.js - 数据库配置与连接4. models/user.js - 用户模型及数据库操作5. controllers/authController.js - 认证控制器6. controllers/userController.j…

VScode+opencv——关于opencv多张图片拼接成一张图片的算法

用于显示多张图片——变量为图片组&#xff0c;图像尺寸&#xff0c;间隙&#xff0c;边界值&#xff0c;输出图片 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;//用于显示多张图片,变量为图片组&#xff0c;图像…

vue之axios根据某个接口创建实例,并设置headers和超时时间,捕捉异常

import axiosNew from axios;//给axios起个别名//创建常量实例 const instanceNew axiosNew.create({//axios中请求配置有baseURL选项&#xff0c;表示请求URL的公共部分&#xff0c;url baseUrl requestUrlbaseURL: baseURL,//设置超时时间为20秒timeout: 20000,headers: {…

从 Rust 官方文档理解 Ownership

Rust 的 Ownership 感觉仍然很复杂&#xff0c;但 Rust 官方文档 The Rust Programming Language - Understanding Ownership 所费篇幅似乎并不多。下面就阅读该文档并记录下来对 Rust Ownership 的理解&#xff0c;相信官方的文档会表述的比准确而清晰。 本文中对 Ownership,…

鸿蒙元服务 证书过期替换 ERROR - hap-sign-tool: error: Signature verify failed

昨天需要升级一版元服务&#xff0c;打包时发现签名过期了&#xff0c;之前替换了App的签名以为很顺利&#xff0c;结果还是搞了小半天。 证书部分 遇到问题&#xff1a;ERROR - hap-sign-tool: error: Signature verify failed 这里需要将p12也替换成最新的。就是说证书文件…

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一&#xff1a;Mysql 容器化安装 二&#xff1a;Redis 容器化安装 Redis 简介 Redis 容器创建 三&#xff1a;C容器制作 四&#xff1a;容器资源更新 常见问题 一&#xff1a;Mysql 容器化安装 进入 mysql 的镜像网站&#xff0c;查找 mysql 的镜像 mysql docker…

Layer1公链介绍:Solana

https://solana.com/ Solana 是一个开源的高性能、无许可区块链项目&#xff0c;由 Anatoly Yakovenko 于2017年创立&#xff0c;旨在支持所有高增长和高频区块链应用&#xff0c;并实现全球金融系统的民主化. 技术亮点 历史证明&#xff08;PoH&#xff09;共识机制&#xf…