数学建模社区-数学中国

标题: 你以为这样写Java代码很6,但我看不懂 [打印本页]

作者: 杨利霞    时间: 2020-4-23 15:03
标题: 你以为这样写Java代码很6,但我看不懂
你以为这样写Java代码很6,但我看不懂8 [& D* P9 N( r& H4 s( [
为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。) S4 P" t# a& x0 W4 F  g% r. ]7 k
6 @: J. r: A% r& N% e
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);" v$ c: I( ^* r$ @; _
10 m- U2 O$ x& z9 G. H
我虽然拥有 10 年的 Java 编程经验,但说实话,很惭愧,这段代码就好像一块板砖拍在我脑袋上,有点懵逼。Lambda 表达式我是学过的,Stream 流我是学过的,forEach() 方法我也是学过的,但把这些知识点全部塞到一行代码中,我还是有点消化不良。1 b; M, J2 }, _9 _, @$ G0 R4 s# g

1 N6 o+ K6 e; K1 a- {我总觉得这行代码不如换成老式的语法(Java 7 之前)来写,就像下面这样:
3 T& w1 k: c9 m0 ?6 P+ T5 ]6 V3 \5 H% R/ F: j" X2 y! ?+ w
for (int i = 1; i < 5; i++) {& j$ B$ h. @8 |" m- w# e0 z
    System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you"));, {' R! e- Z) G& K
}
, j8 [4 S& d4 L! n- a* f+ f1
& [: I& t, M% J0 _) d) c/ T3 k2% Q; |: z$ X; j& s% e7 C
3
  B) Q& C/ e. z. _哇,beautiful code,简洁又明了!不仅我能看得懂,就连刚入门的 Java 小白都能看得懂。要知道,代码是写给人看的,假如只有自己看得懂,只有自己觉得很 6,而其他人看起来云里雾里的,就不一定是好代码,尽管好像是行走在技术的前沿。7 X. H$ N# S* B  r; G, T! d5 |7 N# ]

2 e  W$ r, N, i1 \俗话说得好,“能力越大,责任越大”。Java 8 为我们提供了强大的能力,它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼),包括 Lambda 表达式和 Stream 流,我们通过它们可以写出简洁又高效的代码。打个不恰当的比喻,Java 8 之前,开发者驾驶的是桑塔纳,Java 8 之后,开发者驾驶的是法拉利。4 E1 N% M5 k5 [& w5 V  B+ M$ `
/ x: U0 y: ^4 b7 z1 z6 f

) F7 C; `4 l- d4 y% Y
9 U) C, x3 O" @; ^0 M% h但如果驾驶技术不好的话,法拉利也能变成桑塔纳,甚至还不如。拿之前那段看起来似乎很 6 的代码来说吧,它并不是一段好的代码——尽管使用了新颖的技术,但难以理解。# E" m0 }5 v" @2 g  Q

) R0 M& j1 f3 o* t在 Java 8 之前,如果你想编写函数式代码的话,应该会使用 Google 的 Guava 类库,它是一个很棒的开源类库(不陌生吧),可以在一定程度上弥补 Java 原生类库的不足。我在它的 wiki 上看到下面这样一条建议,说得很富有远见:
6 m; [9 _; R! |9 d# n6 P7 _8 n
4 b, m4 r' o% AExcessive 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.
* \3 b( R- [" G应该能看得懂吧?大致的意思就是说,如果过度使用 Guava 的函数式编程的话,会导致代码冗长、混乱、不可读,甚至低效;如果有些开发者为了减少代码的长度,刻意把多行代码“优化”成一行代码时,Guava 甚至会被玩哭。5 X+ ]+ [- G; i  z# Q3 |+ A8 P( D9 M& `

' O0 z! w2 n) K! U+ @2 Z# g我只能说,优秀的人真可怕,他不仅知道自己的长处,更了解自己的不足——说的就是你,Guava 的开发者。至于开头提到的那位大牛,他写的代码我就不敢恭维,只能说炫技炫到盲目自信吧。根据我的经验,只有很少一部分的大牛能够保持理智,在追求技术创新的同时意识到炫技的问题。8 R( Z% k4 _$ G; a4 j( y+ S
8 D9 k5 W# a, d5 s/ n
我认为,Guava wiki 上的建议同样适用于 Java 8,好技术要妥善的利用,而不是滥用。众所周知,Java 8 的新特性可以用来减少冗余代码,当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子。( S$ e( U& K% V! i% d/ O' T

) {8 |/ a! S" j9 U- v0 l) fThread t1 = new Thread(new Runnable() {# @) y9 Q- p* p) z2 w: h% B4 `
    @Override
; n9 K# R6 H4 ~$ e1 f$ ?    public void run() {
+ B7 t' k  E3 i6 G, v6 f% c        System.out.println("匿名内部类,搞起来");
7 c" a$ d( H; H# b. p$ Q4 _    }4 y9 Q( m7 q/ F$ a: w
});9 u0 ~- C$ S5 M, P
t1.start();
  I) {3 ]8 \8 D4 K; E! s2 i% o% b
// 优化后" l7 d' k- M8 Y5 u" j5 j' d* P

5 H& g5 `& }1 ?, \Thread t2 = new Thread(() -> {
2 Q4 Q9 f8 \4 Q, B    System.out.println("Lambda 表达式,搞起来");
  J; ?7 z: D4 B( {6 P});
& p# [6 E$ i* v* N8 M6 mt2.start();
0 p$ N) C& O# s9 E1
0 X# ?0 ^8 d4 y+ u: f& s3 }2+ f4 T6 h' O7 M  }
3
& V# `, L6 ]: N+ z9 x+ r3 D4+ S) T0 }0 l* I* Q3 x
5
" M( S! f, {, }" r68 e2 W% B* S0 B7 v# I% \( r; s
7+ h% H# P% q2 W8 J2 V* O
8
8 R6 L( `9 ?* c$ \3 Z8 x2 B* e9. u( Q( L* C- b4 Q6 L. [5 j
10# G$ V& c! g, t( M( S2 W1 y, Y  G
11# U) N$ t. e) ^) e- F7 A
12
5 {1 w5 i9 Z: |2 F4 P, a# ?8 z13% B3 H3 a5 Y5 Y/ f2 I
14
5 O4 a3 i# C8 l2 ]你看,优化后的代码量更少,并且一目了然,任谁也不会搞到看不懂的地步。函数式编程出现的目的可不仅仅是为了减少冗余代码,它是为了解放生产力——言外之意就是说,代码复杂点没关系,只要可用可靠。编程的目标不是产生尽可能少的代码,而是产生易于维护的、高性能的系统。4 \1 T- a  E( z& M3 C. D
# o- U9 B; m2 \( H6 n5 L8 Y4 V# ~
举个例子来说,假如我从洛阳出发,去郑州参加一个技术沙龙,我就没必要坐飞机;高铁和驾车才是最优的选择。明白我说的意思吧?别整那些花里胡哨的,实用至上。8 W/ a4 n/ [& P0 l
————————————————
0 p. p* ~' }$ l* T' y( l* u版权声明:本文为CSDN博主「沉默王二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& H: ~1 [; a: \6 }& Y7 \- i原文链接:https://blog.csdn.net/qing_gee/article/details/104709079
  d: T, T- u2 @6 p* a7 B+ F6 P3 a9 E7 N/ J6 ]; q; w& @, i

8 M& m) K2 A( z7 O




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5