QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1558|回复: 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,但我看不懂# O5 F' o( M/ u
    为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。4 @; Z5 ]3 U4 ?' _
    : {: d9 I7 k& _  S" c) B) `
    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);. B2 ]  D7 q& M% h% b0 f
    15 i4 d0 l. n7 d( t3 \/ G" @
    我虽然拥有 10 年的 Java 编程经验,但说实话,很惭愧,这段代码就好像一块板砖拍在我脑袋上,有点懵逼。Lambda 表达式我是学过的,Stream 流我是学过的,forEach() 方法我也是学过的,但把这些知识点全部塞到一行代码中,我还是有点消化不良。
    ! {$ z' g. D3 S! D/ c
    . p) s7 j: V& N, p8 m  |我总觉得这行代码不如换成老式的语法(Java 7 之前)来写,就像下面这样:
    3 e' c/ ?3 q0 H% Y) q2 A& `* B! F9 G& E5 c
    for (int i = 1; i < 5; i++) {
    0 R+ t% x  ?# B; P7 d6 a    System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you"));7 g$ z  F  o2 b
    }8 Z. _0 p$ e, a2 k0 A) b
    1
    , \: s6 c" g' w$ D1 X4 _% _: z9 o2
    7 }" [6 f# P6 P. {2 E* C3
    1 ]6 V) I' R5 U% Z) W6 h7 Y# j哇,beautiful code,简洁又明了!不仅我能看得懂,就连刚入门的 Java 小白都能看得懂。要知道,代码是写给人看的,假如只有自己看得懂,只有自己觉得很 6,而其他人看起来云里雾里的,就不一定是好代码,尽管好像是行走在技术的前沿。
      f( I# z% O- s  {: F2 {; ^1 F6 {9 Z; c% G8 R
    俗话说得好,“能力越大,责任越大”。Java 8 为我们提供了强大的能力,它的新特性是划时代的(Java 8 之后的版本中新特性都不够亮眼),包括 Lambda 表达式和 Stream 流,我们通过它们可以写出简洁又高效的代码。打个不恰当的比喻,Java 8 之前,开发者驾驶的是桑塔纳,Java 8 之后,开发者驾驶的是法拉利。
      M/ a3 w* [- j
    ' m, U$ p# L* h8 c2 W# h: i" |! ]# t; _5 w" K. F. Z) d
    # k' j7 w: K# o$ S6 r
    但如果驾驶技术不好的话,法拉利也能变成桑塔纳,甚至还不如。拿之前那段看起来似乎很 6 的代码来说吧,它并不是一段好的代码——尽管使用了新颖的技术,但难以理解。1 X% z6 {: g4 a: h- ~, R7 i

    : t$ w2 q3 E; f4 O% v在 Java 8 之前,如果你想编写函数式代码的话,应该会使用 Google 的 Guava 类库,它是一个很棒的开源类库(不陌生吧),可以在一定程度上弥补 Java 原生类库的不足。我在它的 wiki 上看到下面这样一条建议,说得很富有远见:, k: q* D1 B& N7 C; A

    5 ^+ e+ }  |6 z: G8 p- N' J0 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.
    2 s  I: Y0 d& c- {* @4 I1 P! U! Q应该能看得懂吧?大致的意思就是说,如果过度使用 Guava 的函数式编程的话,会导致代码冗长、混乱、不可读,甚至低效;如果有些开发者为了减少代码的长度,刻意把多行代码“优化”成一行代码时,Guava 甚至会被玩哭。& }9 \' N8 y" Q' B& E# i% I

    & o$ N7 J% j3 e  ^+ X$ W我只能说,优秀的人真可怕,他不仅知道自己的长处,更了解自己的不足——说的就是你,Guava 的开发者。至于开头提到的那位大牛,他写的代码我就不敢恭维,只能说炫技炫到盲目自信吧。根据我的经验,只有很少一部分的大牛能够保持理智,在追求技术创新的同时意识到炫技的问题。
    % @8 a* a5 I" h2 _
    9 I! h( J: S: m/ L0 L. a# J我认为,Guava wiki 上的建议同样适用于 Java 8,好技术要妥善的利用,而不是滥用。众所周知,Java 8 的新特性可以用来减少冗余代码,当我们把一个复杂的匿名内部类变成一个简洁的 Lambda 表达式就是一个很好的例子。
    0 v* F7 d& n- Z/ v2 ~6 b( ]
    3 i% k# o+ h  {; Q' Q# O; VThread t1 = new Thread(new Runnable() {* r! ?! p/ w8 i0 r
        @Override
    5 y- R/ v6 d+ G+ }* M    public void run() {
    & }2 k$ f" D+ t( H4 A' t8 v! Y. @        System.out.println("匿名内部类,搞起来");
    8 H2 _! q* f! h% X+ O! m1 J3 ?- j    }
    " }$ [4 ^, O% x3 G& K: t, `. z# k});
    0 {- [: y/ h2 |1 q  ?t1.start();% t9 X0 o9 b% ^# d4 F3 a( p3 ]6 L. K

    4 B5 T$ P& @/ Q2 d9 n// 优化后
    ) n8 {. c5 ?6 C# Y/ @- P9 g$ ^5 }' z9 X3 P1 W
    Thread t2 = new Thread(() -> {
    " p: w. ?: n$ ~! A    System.out.println("Lambda 表达式,搞起来");
    5 p' x7 j) W9 }4 x( ^});
    $ }$ h( A% t4 ?- k: t7 u( st2.start();
    & N6 H& A4 K* [7 _% ~7 J: w5 ~0 w! `10 G- t9 m% L5 @7 O$ i
    2( O2 `' Y  ?! K2 |$ \9 P( Q+ J
    38 p9 c/ t$ l0 z3 f
    4
    ( }3 s+ T/ N/ a+ M5: Z6 p! D9 J1 C# t% ]1 x
    62 N- a: @! [6 b# C* _4 r7 y0 T
    77 \/ E9 H0 Q! F2 d
    8) f3 D+ I+ s5 d2 _0 A. A
    9% u% G0 S- ~6 ?/ ]# `
    10: k& s5 L4 B6 d
    11
    8 W3 R4 e- K1 ?: V. y, u12
    ' h* c5 p* J, l( Y4 b' j13/ A8 F5 r: I, L; V
    14
    8 p) ~6 P) k1 h$ B' |0 n' O2 @你看,优化后的代码量更少,并且一目了然,任谁也不会搞到看不懂的地步。函数式编程出现的目的可不仅仅是为了减少冗余代码,它是为了解放生产力——言外之意就是说,代码复杂点没关系,只要可用可靠。编程的目标不是产生尽可能少的代码,而是产生易于维护的、高性能的系统。' ^) o7 v! T7 e* ?( y2 Q9 j3 A
    1 ]2 Y: \; Y$ J8 m+ Z
    举个例子来说,假如我从洛阳出发,去郑州参加一个技术沙龙,我就没必要坐飞机;高铁和驾车才是最优的选择。明白我说的意思吧?别整那些花里胡哨的,实用至上。
    6 Z) a! p7 F: v$ C7 W) O————————————————$ k$ _; G/ `  |" L, y! A1 L; K  ]
    版权声明:本文为CSDN博主「沉默王二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 @5 G' s8 k. c7 P0 \; l2 r
    原文链接:https://blog.csdn.net/qing_gee/article/details/104709079( ~: d2 ~  F' w0 Q" u

    6 f& i, x9 T, q" ~3 B, u/ Y9 v7 j& J( N- @* I& k& Y2 s7 t
    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, 2026-6-9 22:45 , Processed in 0.456341 second(s), 51 queries .

    回顶部