数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-4-23 15:03
标题: 你以为这样写Java代码很6,但我看不懂
你以为这样写Java代码很6,但我看不懂
, ?. ^! `* M3 A$ o# B为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。
  @, _, }& Y9 e! m0 n" X" v; R* z. @" l& o5 \. g" K6 b( t$ p
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);
: u$ v' x4 [; O2 T# m1
' J0 c! o7 W) V! e  n我虽然拥有 10 年的 Java 编程经验,但说实话,很惭愧,这段代码就好像一块板砖拍在我脑袋上,有点懵逼。Lambda 表达式我是学过的,Stream 流我是学过的,forEach() 方法我也是学过的,但把这些知识点全部塞到一行代码中,我还是有点消化不良。
1 X/ e% y+ d- k' R' t9 P) d/ M" ]$ e9 h9 \2 c
我总觉得这行代码不如换成老式的语法(Java 7 之前)来写,就像下面这样:' u2 U; v( h1 J& I) f9 x/ T. |
, g$ D, ?  M4 h( O
for (int i = 1; i < 5; i++) {5 t- s& ]7 r! M" t
    System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you"));
  \* j0 f8 ~7 f7 S$ a) N3 T}8 d# j# t" l" t: I3 ]) A0 [3 W
1
9 n6 u( U7 |/ [( R# Z2# f7 Z) k; }# {' t) F: k
3
! B; w9 Z+ N3 C% J  Q* S哇,beautiful code,简洁又明了!不仅我能看得懂,就连刚入门的 Java 小白都能看得懂。要知道,代码是写给人看的,假如只有自己看得懂,只有自己觉得很 6,而其他人看起来云里雾里的,就不一定是好代码,尽管好像是行走在技术的前沿。: e8 M+ r( e- D6 g7 j* h

; u3 x$ s+ C" v% o% B/ a  D9 P俗话说得好,“能力越大,责任越大”。Java 8 为我们提供了强大的能力,它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼),包括 Lambda 表达式和 Stream 流,我们通过它们可以写出简洁又高效的代码。打个不恰当的比喻,Java 8 之前,开发者驾驶的是桑塔纳,Java 8 之后,开发者驾驶的是法拉利。
! k0 B# j9 Z$ ^# J2 e, p, x  t4 ?# E% h6 c" M

; T" f. S8 V' }+ O  ]
% a8 W2 B6 }8 |- x6 K4 L但如果驾驶技术不好的话,法拉利也能变成桑塔纳,甚至还不如。拿之前那段看起来似乎很 6 的代码来说吧,它并不是一段好的代码——尽管使用了新颖的技术,但难以理解。
- {5 m4 y5 f$ r$ t
. _9 [7 {( u7 ?0 O在 Java 8 之前,如果你想编写函数式代码的话,应该会使用 Google 的 Guava 类库,它是一个很棒的开源类库(不陌生吧),可以在一定程度上弥补 Java 原生类库的不足。我在它的 wiki 上看到下面这样一条建议,说得很富有远见:
+ W) F% Z: B+ @0 x1 y' p* s6 x& k# E4 P6 i! \4 t1 X
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.( m" w  G; T# A7 Y& x4 |
应该能看得懂吧?大致的意思就是说,如果过度使用 Guava 的函数式编程的话,会导致代码冗长、混乱、不可读,甚至低效;如果有些开发者为了减少代码的长度,刻意把多行代码“优化”成一行代码时,Guava 甚至会被玩哭。- C# g' y0 w7 G# c; b: B

6 j# [( X6 w. s7 M我只能说,优秀的人真可怕,他不仅知道自己的长处,更了解自己的不足——说的就是你,Guava 的开发者。至于开头提到的那位大牛,他写的代码我就不敢恭维,只能说炫技炫到盲目自信吧。根据我的经验,只有很少一部分的大牛能够保持理智,在追求技术创新的同时意识到炫技的问题。6 B  v: h$ z3 v# H0 C- A( h8 h+ g
7 f$ b/ _: G% W$ {
我认为,Guava wiki 上的建议同样适用于 Java 8,好技术要妥善的利用,而不是滥用。众所周知,Java 8 的新特性可以用来减少冗余代码,当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子。/ s: B: ~' G! L7 t
2 Z# p2 k6 e" r/ q4 W, Q
Thread t1 = new Thread(new Runnable() {
+ _& c. k  x* F& j5 J% u( F6 x    @Override* Z0 S5 M- V4 h9 s
    public void run() {% R6 w% H, F: p. Y! Y7 D: ?
        System.out.println("匿名内部类,搞起来");
( V7 ]- W0 ]) y1 w5 ^  J    }8 r$ V4 g1 b" S# y& j: [* V2 L
});
/ V. y6 q1 l0 [t1.start();
  l" m* l3 U- n- ^; [; ^# I6 ^' ?2 a- V/ m4 L, m  r/ X7 B
// 优化后& e$ f$ O5 a6 Y1 }) G' D; B' p
1 W" ?, o: V, z! @+ u" C/ a
Thread t2 = new Thread(() -> {* b2 O, V* [: T1 D, A5 h, y5 j. Y
    System.out.println("Lambda 表达式,搞起来");
3 ?: o6 D; L5 \" g. Q});. r* ^" P; Y( `0 Z4 e( o4 j! W) _
t2.start();
; G; v+ _( q* Q6 U1% q8 k2 O4 P2 f8 ]- q8 o5 P$ O
27 B3 d2 w; j6 X  ~9 M$ |/ C
34 W+ x7 x* \/ E# Q9 o
4
' J$ Z* q1 A8 |: u# G3 T& I3 A1 p5
0 U! ]6 W% k* K, ]6
; \2 j: o7 L  i1 K' e  {- A7
: O6 G9 U  ^" z  ^! r6 h8
* X4 ~5 q& r( f& s+ _: G/ `% e9 m' H9
6 A$ [0 }: h7 u$ l( A107 M  P$ V0 G: T" _, i7 R
11. C* v; Y6 q1 `! k: X
12+ W" X$ Q, ^$ N* b2 T
132 G2 u' N: z; @
14
# V8 W4 Q' ]3 V. E0 K6 V% W你看,优化后的代码量更少,并且一目了然,任谁也不会搞到看不懂的地步。函数式编程出现的目的可不仅仅是为了减少冗余代码,它是为了解放生产力——言外之意就是说,代码复杂点没关系,只要可用可靠。编程的目标不是产生尽可能少的代码,而是产生易于维护的、高性能的系统。
# v& X+ R' o3 g% a0 O" Q! Z0 E" o: ]) a- u' s6 \; j7 i1 Z
举个例子来说,假如我从洛阳出发,去郑州参加一个技术沙龙,我就没必要坐飞机;高铁和驾车才是最优的选择。明白我说的意思吧?别整那些花里胡哨的,实用至上。
' J- V3 O* d9 r4 Z% {/ X2 g8 P( L————————————————: p% O' ?& l) T4 y
版权声明:本文为CSDN博主「沉默王二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) J* @( z! H; K. S原文链接:https://blog.csdn.net/qing_gee/article/details/104709079* M' [0 |/ z8 [) e: }
. R/ a( o# k. X# K

; i9 S; ~) e! J/ |% Y0 @0 I* {1 g" c$ `




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