在 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 时,你才真正成熟了。

更多推荐