163. Java Lambda 表达式 - Function 的链式组合

163. Java Lambda 表达式 - Function 的链式组合

在函数式编程中,我们常常希望把多个功能组合起来形成一个新的功能。Java 的 Function<T, R> 接口为此提供了两个非常实用的默认方法:

🧩 andThen() ------ 先执行当前函数,再执行参数函数

java 复制代码
Function<T, R> f1;
Function<R, V> f2;

Function<T, V> result = f1.andThen(f2);

🧩 compose() ------ 先执行参数函数,再执行当前函数

java 复制代码
Function<T, R> f1;
Function<U, T> f2;

Function<U, R> result = f1.compose(f2);

🎯 理解两者的执行顺序

方法名 执行顺序 相当于代码
andThen() f1f2 f2(f1(x))
compose() f2f1 f1(f2(x))

它们实现的是相同的功能组合 ,只是调用方式不同,谁写在前面,谁先执行


📦 实例演示:名字处理链

假设我们有一组名字,需要做如下处理:

  1. 去掉前后空格;
  2. 全部转为大写;
  3. 添加前缀 "Hello, "。

我们可以把这几个步骤封装成函数:

java 复制代码
Function<String, String> trim = String::trim;
Function<String, String> toUpper = String::toUpperCase;
Function<String, String> addPrefix = name -> "Hello, " + name;

✅ 方式一:使用 andThen() 链接函数

java 复制代码
Function<String, String> greet = trim.andThen(toUpper).andThen(addPrefix);
System.out.println(greet.apply("  alice  ")); // 输出:Hello, ALICE

执行顺序是:

  1. trim(" alice ")"alice"
  2. toUpper("alice")"ALICE"
  3. addPrefix("ALICE")"Hello, ALICE"

✅ 方式二:使用 compose() 组合函数(写法反过来)

java 复制代码
Function<String, String> greet = addPrefix.compose(toUpper).compose(trim);
System.out.println(greet.apply("  alice  ")); // 输出:Hello, ALICE

⚠️ 虽然顺序看起来反了,其实执行顺序和 andThen() 完全一样!


🧠 小贴士:如何选用?

情况 推荐方法
自然顺序思维(从左到右) andThen()
倒推逻辑(从右到左) compose()

🛑 类型兼容性注意

不论你是使用 andThen() 还是 compose(),都要确保类型兼容:

  • f1.andThen(f2)f1 的返回类型必须是 f2 的输入类型。
  • f1.compose(f2)f2 的返回类型必须是 f1 的输入类型。
java 复制代码
Function<Integer, Double> half = i -> i / 2.0;
Function<Double, String> asString = d -> "Result: " + d;

// 合法组合
Function<Integer, String> composed = half.andThen(asString);

🧪 练习题(课堂互动)

编写一个函数组合链,接收一个字符串,输出结果如下格式:

"Length: <长度>"

提示步骤:

  1. 去掉空格;
  2. 获取长度;
  3. 拼接前缀字符串。
相关推荐
萌萌哒草头将军19 小时前
🚀🚀🚀 Oxc 恶意扩展警告;Rolldown 放弃 CJS 支持;Vite 发布两个漏洞补丁版本;Rslib v0.13 支持 ts-go
前端·javascript·vue.js
接着奏乐接着舞。19 小时前
3D地球可视化教程 - 第1篇:基础地球渲染系统
前端·javascript·vue.js·3d·three.js
龙傲天66619 小时前
Scala的面向对象和函数式编程特性 Idea环境搭建和输入输出
前端
蓝色海岛19 小时前
element-ui表格嵌套表格,鼠标移入时样式错乱-问题调研及处理办法
前端
cci19 小时前
使用proxychains4反向代理解决依赖下载难题
后端
薄雾晚晴19 小时前
Rspack 实战:用 SWC Loader 搞定 JS 兼容(支持 IE 11 + 现代浏览器,兼顾构建速度)
前端·vue.js
咖啡Beans20 小时前
Python工具DrissionPage推荐
后端·python
恋猫de小郭20 小时前
Flutter 官方 LLM 动态 UI 库 flutter_genui 发布,让 App UI 自己生成 UI
android·前端·flutter
kymjs张涛20 小时前
零一开源|前沿技术周刊 #15
前端·javascript·面试
reacx20 小时前
# 第三章:状态管理架构设计 - 从 Zustand 到 React Query 的完整实践
前端