QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1402|回复: 0
打印 上一主题 下一主题

你以为这样写Java代码很6,但我看不懂

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-4-23 15:03 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    你以为这样写Java代码很6,但我看不懂
    " n4 K, [2 a/ r为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。2 [  z2 c2 T5 T" y! l2 u8 E

    4 A8 u+ a$ ^; EIntStream.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);: n0 P. H# U  e# E% _
    11 W4 u% l( ]5 f( Y* |8 w( S6 b% j
    我虽然拥有 10 年的 Java 编程经验,但说实话,很惭愧,这段代码就好像一块板砖拍在我脑袋上,有点懵逼。Lambda 表达式我是学过的,Stream 流我是学过的,forEach() 方法我也是学过的,但把这些知识点全部塞到一行代码中,我还是有点消化不良。
    $ N, ~. t5 i' n' ?5 U1 S+ A; [
    ; v/ o' I, W8 Z2 g& @' K我总觉得这行代码不如换成老式的语法(Java 7 之前)来写,就像下面这样:
    0 b" Y( ]$ R. ?8 L
    5 C7 C6 F% d9 l7 C' u( u# l. R/ x& afor (int i = 1; i < 5; i++) {
    # `  |" n2 S' l/ {% M3 D    System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you"));
    % M. k3 p- u1 H2 H- F5 s3 S/ b}
    ! {8 O3 p! J8 `: |* [( c$ K" M# y19 m2 @5 M2 Y: C% ?6 Z
    2
    , j1 T* v% d& y0 j) p# d3
    ' X/ J1 V6 L! n5 r+ V1 _2 x  B哇,beautiful code,简洁又明了!不仅我能看得懂,就连刚入门的 Java 小白都能看得懂。要知道,代码是写给人看的,假如只有自己看得懂,只有自己觉得很 6,而其他人看起来云里雾里的,就不一定是好代码,尽管好像是行走在技术的前沿。8 I, `" P, c5 d

    - ]) M) w/ N; L& A; L俗话说得好,“能力越大,责任越大”。Java 8 为我们提供了强大的能力,它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼),包括 Lambda 表达式和 Stream 流,我们通过它们可以写出简洁又高效的代码。打个不恰当的比喻,Java 8 之前,开发者驾驶的是桑塔纳,Java 8 之后,开发者驾驶的是法拉利。4 d2 J6 O2 u+ ^& t& E

    ! g: n3 D/ k/ ?' w
    % S  H# w( ]. U% l& A8 b( h" e% z9 p' y
    但如果驾驶技术不好的话,法拉利也能变成桑塔纳,甚至还不如。拿之前那段看起来似乎很 6 的代码来说吧,它并不是一段好的代码——尽管使用了新颖的技术,但难以理解。
    " B3 N8 t" Y% t9 {0 @6 N
    2 @/ w# F3 u/ N" v  z9 R在 Java 8 之前,如果你想编写函数式代码的话,应该会使用 Google 的 Guava 类库,它是一个很棒的开源类库(不陌生吧),可以在一定程度上弥补 Java 原生类库的不足。我在它的 wiki 上看到下面这样一条建议,说得很富有远见:
    & I- v, P; }& U$ h8 ?# j/ r1 W/ a4 w: B: T
    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.# P7 |* X1 |) \1 g
    应该能看得懂吧?大致的意思就是说,如果过度使用 Guava 的函数式编程的话,会导致代码冗长、混乱、不可读,甚至低效;如果有些开发者为了减少代码的长度,刻意把多行代码“优化”成一行代码时,Guava 甚至会被玩哭。0 ~: Q) K. d! J2 `' N1 X% s; u
    . z. h0 [2 j8 R0 c" v9 N6 f) V
    我只能说,优秀的人真可怕,他不仅知道自己的长处,更了解自己的不足——说的就是你,Guava 的开发者。至于开头提到的那位大牛,他写的代码我就不敢恭维,只能说炫技炫到盲目自信吧。根据我的经验,只有很少一部分的大牛能够保持理智,在追求技术创新的同时意识到炫技的问题。* {& p* F0 P; y( ?

    " a/ P- p" M! h. r2 N我认为,Guava wiki 上的建议同样适用于 Java 8,好技术要妥善的利用,而不是滥用。众所周知,Java 8 的新特性可以用来减少冗余代码,当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子。0 q% ^/ E+ s1 k/ I/ \. b

    2 v1 l& L0 }. u/ V7 n, A" g5 A! TThread t1 = new Thread(new Runnable() {
    ( H# j. E( P. U9 d+ k7 ]    @Override( f  G: |4 \4 Q
        public void run() {
    7 y0 V# K$ R$ p5 n0 M) Y- |. D. \        System.out.println("匿名内部类,搞起来");
    ( f+ @! c9 o6 g7 {, d    }+ q; M+ n5 |9 h' m) K
    });# U4 e. j! x" I* b% H( f
    t1.start();
    ' O  o9 _+ ^! r$ A$ e4 X& w% |5 e# y; \. u. g
    // 优化后
    5 Q' F: Y- Z/ K0 k0 y1 E2 }# K) ]/ M4 p- C/ a
    Thread t2 = new Thread(() -> {: }5 e9 |- t8 D
        System.out.println("Lambda 表达式,搞起来");
    3 i4 e- O) d: H& k8 p1 |- x& t) \});
    ! l+ C( q% T, `0 Ft2.start();
    2 F. F: k8 w( }% b$ {4 q1
    - \+ H4 L5 {! U, S% C7 ^. t0 P2
    7 M9 b7 n9 z* x3
    9 i! u+ N9 J2 B- ~1 B# e/ F4) T6 I# M' V( G7 F8 f; H* R# o, e
    5, b5 k- s% D& Z  k, ]9 w$ j
    6( q6 _; U1 k% @3 D. `+ r
    7. v9 k7 z) x; g- z. d
    8. e" c0 @; I' X! g. F
    9
    9 H) Y3 a; |4 ^' e5 W10
    6 J% Z( j: z9 v1 H11. {$ C( J$ e- X, K; [! @) I
    12, l7 d+ x( |7 X+ |
    13
    : z/ B( U, I4 J+ h  P( G14" R" ~* }; r6 J, h* w' g# D
    你看,优化后的代码量更少,并且一目了然,任谁也不会搞到看不懂的地步。函数式编程出现的目的可不仅仅是为了减少冗余代码,它是为了解放生产力——言外之意就是说,代码复杂点没关系,只要可用可靠。编程的目标不是产生尽可能少的代码,而是产生易于维护的、高性能的系统。- s- G1 P/ G/ ^+ o3 v! m$ C3 j' x1 r

    - F+ r; Z" F6 B1 {8 J0 F举个例子来说,假如我从洛阳出发,去郑州参加一个技术沙龙,我就没必要坐飞机;高铁和驾车才是最优的选择。明白我说的意思吧?别整那些花里胡哨的,实用至上。
    5 K/ [9 h8 b" K————————————————
    8 c8 }4 F8 b% t! U版权声明:本文为CSDN博主「沉默王二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 F! [/ ^) }, M) w' c9 w2 J
    原文链接:https://blog.csdn.net/qing_gee/article/details/104709079+ B/ F4 X0 A, ?
    " c) W. o  j+ o3 T  g
    ( ?4 F3 _1 O1 W3 x) F
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-7-14 16:17 , Processed in 0.460360 second(s), 51 queries .

    回顶部