数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-4-23 15:03
标题: 你以为这样写Java代码很6,但我看不懂
你以为这样写Java代码很6,但我看不懂" Y+ x+ F9 Y- d5 r* A9 P8 g# w
为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。. \- N, z* p" Z% ^  d
0 Q/ X% K  y- @3 ^+ T9 m
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);. @/ c- t/ o2 d% i3 @. d$ |
1! W+ I) k6 _6 V0 D
我虽然拥有 10 年的 Java 编程经验,但说实话,很惭愧,这段代码就好像一块板砖拍在我脑袋上,有点懵逼。Lambda 表达式我是学过的,Stream 流我是学过的,forEach() 方法我也是学过的,但把这些知识点全部塞到一行代码中,我还是有点消化不良。4 `( B9 ^1 b+ M  d1 n& r6 V1 v

, i. D8 ~7 |! P  {7 ]我总觉得这行代码不如换成老式的语法(Java 7 之前)来写,就像下面这样:) g7 ?. e/ v/ M1 B

4 ]. m5 d3 p2 I4 k* yfor (int i = 1; i < 5; i++) {
+ H9 n- p/ P0 E5 S1 Z# X% I    System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you"));
1 W8 z  w" [9 ~& U: p}7 q# W! n/ G/ m) y( R- U
1
4 {( D. A' H2 C; ~' C$ f9 [$ z2
: d) V$ \& p2 I3
: h8 ?. b3 n- ?9 F- y哇,beautiful code,简洁又明了!不仅我能看得懂,就连刚入门的 Java 小白都能看得懂。要知道,代码是写给人看的,假如只有自己看得懂,只有自己觉得很 6,而其他人看起来云里雾里的,就不一定是好代码,尽管好像是行走在技术的前沿。( P$ J  O8 H4 R* Q" Y- A
9 ?7 u4 C+ ?9 J
俗话说得好,“能力越大,责任越大”。Java 8 为我们提供了强大的能力,它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼),包括 Lambda 表达式和 Stream 流,我们通过它们可以写出简洁又高效的代码。打个不恰当的比喻,Java 8 之前,开发者驾驶的是桑塔纳,Java 8 之后,开发者驾驶的是法拉利。
+ _. ~; b: w/ u+ s& u* m% Q% R9 i; I; E

6 w* [) }# o! E) W9 E) B; ~0 t* [/ o- H
但如果驾驶技术不好的话,法拉利也能变成桑塔纳,甚至还不如。拿之前那段看起来似乎很 6 的代码来说吧,它并不是一段好的代码——尽管使用了新颖的技术,但难以理解。& h; b( V1 R: g$ Y" t3 a5 D

/ G  V9 @+ J% @. T在 Java 8 之前,如果你想编写函数式代码的话,应该会使用 Google 的 Guava 类库,它是一个很棒的开源类库(不陌生吧),可以在一定程度上弥补 Java 原生类库的不足。我在它的 wiki 上看到下面这样一条建议,说得很富有远见:0 s  x7 q" {! o$ Y6 ^; V) R5 ^

  e1 o9 Z/ I6 K  S( zExcessive 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.( L/ x$ k) I! }4 g+ u
应该能看得懂吧?大致的意思就是说,如果过度使用 Guava 的函数式编程的话,会导致代码冗长、混乱、不可读,甚至低效;如果有些开发者为了减少代码的长度,刻意把多行代码“优化”成一行代码时,Guava 甚至会被玩哭。7 I/ _5 f9 q: F' e. C+ r/ c" z
" k, g3 p% c! T( L1 i( I
我只能说,优秀的人真可怕,他不仅知道自己的长处,更了解自己的不足——说的就是你,Guava 的开发者。至于开头提到的那位大牛,他写的代码我就不敢恭维,只能说炫技炫到盲目自信吧。根据我的经验,只有很少一部分的大牛能够保持理智,在追求技术创新的同时意识到炫技的问题。$ g$ l- ^8 u6 R1 S
- _; u  k2 `+ y2 e
我认为,Guava wiki 上的建议同样适用于 Java 8,好技术要妥善的利用,而不是滥用。众所周知,Java 8 的新特性可以用来减少冗余代码,当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子。
8 E' m% F/ O- ^' S5 a" F, [  f4 [
) g7 ]8 c9 Z( C; ]3 ~1 L/ Q8 G0 }Thread t1 = new Thread(new Runnable() {2 T  W! H' V0 q' ?) D
    @Override; m7 Q3 X$ L' l/ @  n$ \* K  m
    public void run() {2 |/ |- d; o& z9 L! c
        System.out.println("匿名内部类,搞起来");
# h/ B0 A! o2 q& y    }
: t7 `) R# C  O! S9 h( z});9 I- J% l: ~( b, t$ X3 O& C
t1.start();  ?2 w$ M4 v) V# Y5 ~" X( @
6 z2 q/ Y, h( n! X  s6 W" C* x% n/ \
// 优化后1 V3 N' [. g: q2 K: s7 g) j
& x* V; q( D% X% i6 w
Thread t2 = new Thread(() -> {' K3 F% e# m$ C% m5 c
    System.out.println("Lambda 表达式,搞起来");
; j6 Y" U- ]- g0 B- R});
: e/ ]$ n* x! t0 p, I5 Z- x$ C* ^$ ^3 mt2.start();
  _: F3 {2 J% G8 z, G/ a* g) A10 j. ]0 Z9 Q' p- J
2/ ~7 Y! n% T" ?
3
7 r* P# W7 y8 n1 b. a$ T. u7 q0 t40 u2 O& |6 c" |) \3 r
5
/ s& q( N+ ~0 v& P1 M' j) R6% N$ C+ P7 w3 B& u7 c" d! ^9 k
72 \8 l/ ]( R  U0 _2 Y/ s1 H& P
8# I% }: C% ^6 ~( p  k8 ]/ Z
9- [) p; g/ E( w# q0 q3 j) L/ ?& p
10
6 n" V, _+ b+ F; ?& Y11
; G6 @! K; X' D* p4 M3 ~8 ~, G- B12
) e9 S% s* A& f13
- R; B2 q9 `! w( P8 Q14
8 y5 x0 q1 i7 ~, c2 z- [( T0 T2 Z你看,优化后的代码量更少,并且一目了然,任谁也不会搞到看不懂的地步。函数式编程出现的目的可不仅仅是为了减少冗余代码,它是为了解放生产力——言外之意就是说,代码复杂点没关系,只要可用可靠。编程的目标不是产生尽可能少的代码,而是产生易于维护的、高性能的系统。/ ^' ~0 F3 O1 W  N% ]

/ s& V+ R- _% R# e+ k; M举个例子来说,假如我从洛阳出发,去郑州参加一个技术沙龙,我就没必要坐飞机;高铁和驾车才是最优的选择。明白我说的意思吧?别整那些花里胡哨的,实用至上。# a8 O4 {  T$ L+ J
————————————————
4 K) h  i. F6 z. z. Q2 H版权声明:本文为CSDN博主「沉默王二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% ~; F# e" p8 r/ @: {" ?4 k
原文链接:https://blog.csdn.net/qing_gee/article/details/104709079
( r3 ?1 R; I2 A3 r' _% H1 y" a7 f* {$ }' o& N& c
; J5 B/ U/ A( ]9 `





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