% Y2 f& Y# m4 M% E: w7 @6 OIntStream.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); ! w! x- Z4 e0 A, }1 w) q1 : o! C! Q. S' f. t) U我虽然拥有 10 年的 Java 编程经验,但说实话,很惭愧,这段代码就好像一块板砖拍在我脑袋上,有点懵逼。Lambda 表达式我是学过的,Stream 流我是学过的,forEach() 方法我也是学过的,但把这些知识点全部塞到一行代码中,我还是有点消化不良。2 v* @! S/ x) g5 X
) U1 r' {2 Z# S$ `- B我总觉得这行代码不如换成老式的语法(Java 7 之前)来写,就像下面这样:$ _: ?8 h. L: ]" P( \! d
! I0 V+ p0 C9 M2 V
for (int i = 1; i < 5; i++) {0 e N: q0 Y' s
System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you")); 2 y3 Q2 f: V4 s; u1 h}: {9 f3 m4 y# H6 J
1; _8 J, s3 T! X* N4 o
23 J' b" B& S5 t a/ Z% D( L8 K
3 2 J0 B) P3 q+ K& W3 L4 P哇,beautiful code,简洁又明了!不仅我能看得懂,就连刚入门的 Java 小白都能看得懂。要知道,代码是写给人看的,假如只有自己看得懂,只有自己觉得很 6,而其他人看起来云里雾里的,就不一定是好代码,尽管好像是行走在技术的前沿。 ' U+ G5 Z; `+ E' k, X ! L# N* U% T3 f; ?% k' {! ^俗话说得好,“能力越大,责任越大”。Java 8 为我们提供了强大的能力,它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼),包括 Lambda 表达式和 Stream 流,我们通过它们可以写出简洁又高效的代码。打个不恰当的比喻,Java 8 之前,开发者驾驶的是桑塔纳,Java 8 之后,开发者驾驶的是法拉利。 8 f+ M8 ^$ }' |+ e! r6 Y" S0 z, |1 w; J/ I
. O% b1 b8 z. I3 W
S$ g% @, n( i! B5 x' T) ~但如果驾驶技术不好的话,法拉利也能变成桑塔纳,甚至还不如。拿之前那段看起来似乎很 6 的代码来说吧,它并不是一段好的代码——尽管使用了新颖的技术,但难以理解。# N( P: R( l W5 u* m& T& E
4 S: @' M* U( p w% `. N" }
在 Java 8 之前,如果你想编写函数式代码的话,应该会使用 Google 的 Guava 类库,它是一个很棒的开源类库(不陌生吧),可以在一定程度上弥补 Java 原生类库的不足。我在它的 wiki 上看到下面这样一条建议,说得很富有远见:, j: C$ g- e4 g* X; b
* T. T% G; ]! I( L5 ~- RExcessive 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. " ^9 v8 P9 R2 n; E8 g应该能看得懂吧?大致的意思就是说,如果过度使用 Guava 的函数式编程的话,会导致代码冗长、混乱、不可读,甚至低效;如果有些开发者为了减少代码的长度,刻意把多行代码“优化”成一行代码时,Guava 甚至会被玩哭。 0 o9 {. Q. x- b1 ]6 C2 Q% U1 T/ t" D7 ~9 ~$ D7 @( p4 w8 {: V
我只能说,优秀的人真可怕,他不仅知道自己的长处,更了解自己的不足——说的就是你,Guava 的开发者。至于开头提到的那位大牛,他写的代码我就不敢恭维,只能说炫技炫到盲目自信吧。根据我的经验,只有很少一部分的大牛能够保持理智,在追求技术创新的同时意识到炫技的问题。( k. K9 K+ G) k& o) F' d0 v
+ ?) x' [6 c0 U1 |4 g% U我认为,Guava wiki 上的建议同样适用于 Java 8,好技术要妥善的利用,而不是滥用。众所周知,Java 8 的新特性可以用来减少冗余代码,当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子。3 T; F/ J& b, E' E. k% p& _# L$ B
) O' z* q/ ~/ {6 p: ?4 z3 AThread t1 = new Thread(new Runnable() {. Z- N! _7 b+ m8 K
@Override6 K) y0 r+ u, @+ J1 E
public void run() {) O, T4 ] H( P+ T4 u
System.out.println("匿名内部类,搞起来"); 4 y- z) ]3 g3 G, d# D! L }) @( f4 ~! B% ]$ ^% d
}); " t4 n% ^0 P" q# I8 ht1.start();5 i7 A5 c. x' i8 N% U% l
]% @# X7 J* M. e9 Q: D% w8 C; N
// 优化后 # l V$ a0 T$ _. e0 C; I1 A0 c: t3 @' W, z R0 i
Thread t2 = new Thread(() -> { C& [- t Y0 G System.out.println("Lambda 表达式,搞起来");# i0 `3 t2 Q! V
}); n1 u! v4 \" }8 r- Q1 ?0 X
t2.start();1 U/ a+ x+ o8 J5 ^8 J
1 ( s: r _2 C0 q2( j7 C; T' b) b, U) T
32 j7 }! |' ~0 j- u$ I2 L" N& d
4 ! _3 C6 a4 K" L3 Q" |9 a& @$ b5 ' H- k4 H- D$ ?! {, a6 B* P" {$ [: K0 K' U7 I+ a7 L) ]4 T$ p9 D1 A8 }3 d" \3 R1 s" }
8. `( ~) [# r! Q+ w# `
9' a% [, Z* L7 r9 D
10 ' J+ I$ R. ?8 e3 e `( S- u111 t0 k9 }* M( Y
12 K+ V" C3 j. O5 f
13+ }- D6 s" `1 z9 B& H1 y1 l. x
14 3 ^( n- t5 U3 a, B+ w: f2 u; ]你看,优化后的代码量更少,并且一目了然,任谁也不会搞到看不懂的地步。函数式编程出现的目的可不仅仅是为了减少冗余代码,它是为了解放生产力——言外之意就是说,代码复杂点没关系,只要可用可靠。编程的目标不是产生尽可能少的代码,而是产生易于维护的、高性能的系统。 5 k, T6 D% j% ^5 o7 H6 ]- N/ M Y. b1 @* a, ~1 [
举个例子来说,假如我从洛阳出发,去郑州参加一个技术沙龙,我就没必要坐飞机;高铁和驾车才是最优的选择。明白我说的意思吧?别整那些花里胡哨的,实用至上。" a$ O d! o' X% K1 \- e6 o
———————————————— % T1 W8 r2 m, e" D' l9 y7 {1 K. n版权声明:本文为CSDN博主「沉默王二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 m1 z2 W, e. f9 [+ v/ ^6 W
原文链接:https://blog.csdn.net/qing_gee/article/details/104709079 1 i5 U( C2 u/ o ?$ e ( Y$ E. }" g9 b& k7 P$ Y! I/ L) |: a6 F7 Q+ E1 g