你好呀, 我是沉默王二, 一个和黄家驹一样身高, 和刘德华一样颜值的程序员. 为了提高 Java 编程的技艺, 我最近在 GitHub 上学习一些高手编写的代码. 下面这一行代码 (出自大牛之手) 据说可以征服你的朋友, 让他们觉得你写的代码很 6, 来欣赏一下吧.
IntStream.range(1, 5).boxed().map(i -> { System.out.print("Happy Birthday"); if (i == 3) return "dear NAME"; else return "to You"; }).forEach(System.out::println);
我虽然拥有 10 年的 Java 编程经验, 但说实话, 很惭愧, 这段代码就好像一块板砖拍在我脑袋上, 有点懵逼. Lambda 表达式我是学过的, Stream 流我是学过的, forEach() 方法我也是学过的, 但把这些知识点全部塞到一行代码中, 我还是有点消化不良.
我总觉得这行代码不如换成老式的语法 (Java 7 之前) 来写, 就像下面这样:
- for (int i = 1; i < 5; i++) {
- System.out.println("Happy Birthday" + (i == 3 ? "dear NAME" : "to you"));
- }
哇, beautiful code, 简洁又明了! 不仅我能看得懂, 就连刚入门的 Java 小白都能看得懂. 要知道, 代码是写给人看的, 假如只有自己看得懂, 只有自己觉得很 6, 而其他人看起来云里雾里的, 就不一定是好代码, 尽管好像是行走在技术的前沿.
俗话说得好,"能力越大, 责任越大".Java 8 为我们提供了强大的能力, 它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼), 包括 Lambda 表达式和 Stream 流, 我们通过它们可以写出简洁又高效的代码. 打个不恰当的比喻, Java 8 之前, 开发者驾驶的是桑塔纳, Java 8 之后, 开发者驾驶的是法拉利.
但如果驾驶技术不好的话, 法拉利也能变成桑塔纳, 甚至还不如. 拿之前那段看起来似乎很 6 的代码来说吧, 它并不是一段好的代码 -- 尽管使用了新颖的技术, 但难以理解.
在 Java 8 之前, 如果你想编写函数式代码的话, 应该会使用 Google 的 Guava 类库, 它是一个很棒的开源类库(不陌生吧), 可以在一定程度上弥补 Java 原生类库的不足. 我在它的 wiki 上看到下面这样一条建议, 说得很富有远见:
Excessive use of Guava's functional programming idioms can lead to verbose, confusing, unreadable and inefficient code. .. when you go to preposterous lengths to make your code"a one-line", the Guava team weeps.
应该能看得懂吧? 大致的意思就是说, 如果过度使用 Guava 的函数式编程的话, 会导致代码冗长, 混乱, 不可读, 甚至低效; 如果有些开发者为了减少代码的长度, 刻意把多行代码 "优化" 成一行代码时, Guava 甚至会被玩哭.
我只能说, 优秀的人真可怕, 他不仅知道自己的长处, 更了解自己的不足 -- 说的就是你, Guava 的开发者. 至于开头提到的那位大牛, 他写的代码我就不敢恭维, 只能说炫技炫到盲目自信吧. 根据我的经验, 只有很少一部分的大牛能够保持理智, 在追求技术创新的同时意识到炫技的问题.
我认为, Guava wiki 上的建议同样适用于 Java 8, 好技术要妥善的利用, 而不是滥用. 众所周知, Java 8 的新特性可以用来减少冗余代码, 当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子.
- Thread t1 = new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println("匿名内部类, 搞起来");
- }
- });
- t1.start();
- // 优化后
- Thread t2 = new Thread(() -> {
- System.out.println("Lambda 表达式, 搞起来");
- });
- t2.start();
你看, 优化后的代码量更少, 并且一目了然, 任谁也不会搞到看不懂的地步. 函数式编程出现的目的可不仅仅是为了减少冗余代码, 它是为了解放生产力 -- 言外之意就是说, 代码复杂点没关系, 只要可用可靠. 编程的目标不是产生尽可能少的代码, 而是产生易于维护的, 高性能的系统.
举个例子来说, 假如我从洛阳出发, 去郑州参加一个技术沙龙, 我就没必要坐飞机; 高铁和驾车才是最优的选择. 明白我说的意思吧? 别整那些花里胡哨的, 实用至上.
来源: https://www.cnblogs.com/qing-gee/p/12432756.html