Java Function:一个把程序员逼疯的“函数”

在 Java 江湖里,有一种神秘生物。
它长这样:
Function<T, R>
初学者第一次见到它时,通常会陷入沉思:
“这到底是个什么玩意儿?”
有人说它是函数。有人说它是接口。有人说它是 Lambda 的坐骑。
还有人第一次看到:
s -> s.length()
直接开始怀疑人生:
“Java 什么时候变成 JavaScript 了?”
一、Function 的本质
其实,Function 很简单。
它本质上就是:
输入一个东西加工一下输出另一个东西
翻译成人话:
把土豆放进去薯片出来
二、传统 Java 程序员 VS Function
在远古时代(Java 8 以前),Java 程序员写代码是这样的:
public Integer getLength(String str) {return str.length();}
非常庄严。
非常正式。
像在写法院判决书。
后来 Java 8 来了。
世界变了。
程序员开始这样写:
Function<String, Integer> f = s -> s.length();
老程序员看到后:
?????
内心 OS:
“变量里怎么还能装方法???”
三、Function 最可怕的地方
Function 最恐怖的能力:
它能把“逻辑”当参数传来传去
例如:
public void execute(Function<String, String> func) {System.out.println(func.apply("hello"));}
调用:
execute(s -> s.toUpperCase());
输出:
HELLO
第一次看到这种代码的时候。
很多 Java 程序员会产生一种错觉:
“我是不是误入了 Python 世界?”
四、Stream:Function 的大型犯罪现场
真正让无数人崩溃的。
是 Stream。
以前遍历 List:
for (String s : list) {System.out.println(s);}
人人看得懂。
奶奶都能学会。
后来:
list.stream().map(s -> s.length()).filter(len -> len > 3).sorted().collect(Collectors.toList());
新人:
map 是什么?filter 是什么?collect 又是什么?
而最恐怖的是:
s -> s.length()
居然是:
Function<String, Integer>
五、Function 最大的问题
Function 有个致命问题:
太抽象了
例如:
Function<User, UserVO>
你还能理解。
但当项目写到后期。
你会看到:
Function<Function<Function<String, Integer>,List<User>>,Map<String, Object>>
这时候:
程序员会开始思考生命的意义。
六、最经典的面试现场
面试官:
“请问 Function 和 Consumer 的区别是什么?”
候选人:
Function 有返回值Consumer 没有返回值
面试官满意点头。
下一秒:
“那 Supplier 呢?”
候选人开始冒汗:
Supplier……是不是负责送外卖的?
七、Java 为什么非要搞 Function?
因为 Java 发现:
代码里最容易重复的,其实是“逻辑”
比如:
以前:
查用户查订单查商品
每次都复制粘贴。
后来大家发现:
真正变化的不是流程。
而是:
“中间处理逻辑”
于是:
Java 说:
“那我把逻辑也变成对象吧。”
于是:
Function
诞生了。
八、Function 的终极形态
当程序员熟练之后。
会进入一种诡异状态。
他们开始:
stream().map().flatMap().peek().reduce().collect()
一路链式调用。
全程没有一个 for 循环。
此时他们会产生一种错觉:
“我写的不像 Java 了。”
而实际上:
他们已经进化成了“函数式法师”
九、真正的高手
真正的 Java 高手。
不是会写:
Function<String, Integer>
而是:
知道什么时候不用它
因为很多时候:
s -> s.length()
确实优雅。
但有时候:
Function<Map<String,List<UserDTO>>,CompletableFuture<Result<Page<VO>>>>
已经不是编程了。
而是:
咒语。
十、最后总结
Function 的本质:
输入 -> 加工 -> 输出
它让 Java:
-
更灵活
-
更现代
-
更像函数式语言
同时也让:
-
调试更痛苦
-
泛型更离谱
-
新人更崩溃
但不可否认的是:
Function 改变了整个 Java 世界。
它让 Java 程序员第一次意识到:
“原来方法也可以像变量一样到处传。”
这是 Java 从“传统面向对象”走向“现代函数式”的开始。
最后送大家一句:
当你看懂 Function 时,你只是入门了 Java 8。当你开始滥用 Function 时,你已经成为高级工程师了。当你开始删除 Function 时,你才真正成熟了。更多推荐

所有评论(0)