V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX  ›  推广

Groovy 初体验:构建高性能 JVM 应用

  •  
  •   hansonwang99 · 2018-03-22 08:47:19 +08:00 · 4585 次点击
    这是一个创建于 2430 天前的主题,其中的信息可能已经有所发展或是发生改变。

    VAIO 王者归来


    为什么要学 Groovy

    Groovy 运行于 JVM 之上,然而其对动态语言函数式编程范式以及元编程功能的加持所带来的表现力和简洁性可以说甩了 Java 几条街。我们可以利用 Groovy 的所有动态功能构建高性能的 JVM 应用、将开发效率提高几个数量级! 再比如说我们用的 CI 系统 Jenkins,其 Pipeline 的编排 Jenkinsfile 文件就是用 Groovy 来书写,除此之外还有很多应用 Groovy 的地方。这就是我们为什么要学它!


    Groovy 环境部署

    本文实验所用 OS 为 CentOS7,这里介绍使用 sdk 工具来安装 Groovy 的方法。

    • 首先在命令行下执行:

    curl -s get.sdkman.io | bash

    炫酷得一腿!

    • 接下来执行:

    source "$HOME/.sdkman/bin/sdkman-init.sh"

    • 然后我们就可以使用 sdk 工具来安装 Groovy:

    一句话搞定!

    sdk install groovy

    sdk install

    • 完成之后我们来检查 Groovy 安装状态

    groovy -v

    一切就绪

    image.png


    Hello World From Groovy

    [root@localhost ~]# vim Hello.groovy
    [root@localhost ~]# more Hello.groovy 
    println "Hello World From Groovy !"
    [root@localhost ~]# groovy Hello
    Hello World From Groovy !
    

    Groovy 语言特性

    • Groovy 是轻量级的 Java
    • Groovy 的信噪比比 Java 高:较少的代码获得更多结果
    • GDK = Groovy JDK:通过向 JDK 的各种类中添加便捷方法,Groovy 扩展了 JDK 形成了 GDK 库
    • return 语句可选,分号结尾可选
    • 方法和类默认 public
    • 导航操作符可帮助实现对象引用不为空时方法才会被调用
    • Groovy 不强迫捕获自己不关心的异常,没捕获的异常自动传到高层
    • 静态方法内可使用 this 来引用 Class 对象,因此可以链式调用!

    两大优点:表现力 + 简洁!!!


    从 Java 到 Groovy

    用 Java 写一段代码如下:

    public class Greetingss {
    
      public static void main( String[] args ) {
        for( int i=0; i<3; i++ ) {
          System.out.println("ho ");
        }
        System.out.println("Merry Groovy");
      }
    }
    

    用 Groovy 重构一遍如下:

    for(i in 0..2) {
      print 'ho '
    }
    print 'Merry Groovy'
    

    看看两种语言的信噪比对比,真是给人不可估量的感动!

    安全导航操作符 ?.

    可以避免代码中的大量 null 引用的判断

    def foo( str ) {
      str?.reverse()  // 仅当 str 不为 null 时 reverse 才会执行
    }
    

    这可以帮我们省多少个if啊!!!


    异常处理

    与 Java 相比,Groovy 的异常处理少了很多繁文缛节

    对于那些不想处理或者不适合在代码当前层次处理的异常,Groovy 对用户不做任何要求,任何用户未处理的异常会自动传递到高一层,我们啥也不用写:

    def openfile( fileName ) {  // 无需 throws
      new FileInputStream( fileName ) // 无需 try...catch... 处理
    }
    

    异常可以放到其调用代码中处理:

    try {
      openFile("nonexistfile")
    } catch( FileNotFoundException ex ) {
      print "Oops: " + ex
    }
    

    若捕获所有异常( Exception ),则上面 catch 中异常的类型都可省略:

    try {
      openFile("nonexistfile")
    } catch( ex ) {  // 省略类型表示可捕获所有异常
      print "Oops: " + ex
    }
    

    链式调用

    静态方法内可使用 this 来引用 Class 对象,因此可以链式调用

    class Wizard {
      def static learn( trick, action ) {
        //...
        this
      }
    }
    
    Wizard.learn('xxxx', {...})
      .learn('yyyy', {...})
      .learn('zzzz', {...})
    

    后记

    作者更多的原创文章在此

    20 条回复    2018-11-02 13:06:46 +08:00
    whileFalse
        1
    whileFalse  
       2018-03-22 09:14:20 +08:00
    Java 就是废话太多。然而这保证了静态检查的完备。
    sujin190
        2
    sujin190  
       2018-03-22 09:23:47 +08:00
    @whileFalse #1 然而很多情况并不需要如此完备的静态检查
    stanjia
        3
    stanjia  
       2018-03-22 09:49:34 +08:00   ❤️ 2
    动态一时爽,重构火葬场。
    warcraft1236
        4
    warcraft1236  
       2018-03-22 09:51:15 +08:00
    感觉和 Python 一样很适合测试人员啊
    HuHui
        5
    HuHui  
       2018-03-22 10:44:42 +08:00
    "构建高性能 JVM 应用"
    ???
    closedevice
        6
    closedevice  
       2018-03-22 10:46:58 +08:00
    得了吧,之前写了半年多 groovy 后才知道没啥卵用,语法上的简洁早期开发有所收益,但后期维护的代价超过早期收益.
    des
        7
    des  
       2018-03-22 10:54:15 +08:00 via Android
    看到 curl xx | bash 就觉得心大,连个 https 都不加的
    meowu
        8
    meowu  
       2018-03-22 11:15:28 +08:00 via Android
    那缺点是什么呢?只有优点?
    glues
        9
    glues  
       2018-03-22 12:11:51 +08:00   ❤️ 1
    不写测试的,无论动态静态,都是火葬场
    miao1007
        10
    miao1007  
       2018-03-22 12:21:38 +08:00 via Android
    性能问题
    sorra
        11
    sorra  
       2018-03-22 13:07:05 +08:00
    你也在网上冲浪啊!
    somebody
        12
    somebody  
       2018-03-22 14:06:23 +08:00
    动态一时爽,重构火葬场。去年用 Groovy 写了个 Android 用的 Gradle 插件,20 个 Groovy 文件,1000 行代码。
    很酸爽,重构函数名,调用的地方就是不像 Java 一样报错,眼睁睁瞅着调用的地方没跟着变。

    Kotlin 了解一下
    justinwu
        13
    justinwu  
       2018-03-22 15:43:17 +08:00 via iPhone
    感觉没 kotlin 有前景,android 开发上 Google 把 kotlin 纳入正房,对 kotin 影响非常深远,

    google android 开发官方推特上现在天天发 kotlin 的奇技淫巧。
    RubyJack
        14
    RubyJack  
       2018-03-22 16:04:01 +08:00
    动不动就高性能,高并发什么的,歪风邪气也不知道谁带起来的
    mritd
        15
    mritd  
       2018-03-22 16:08:39 +08:00
    "构建高性能 JVM 应用"
    ???
    mritd
        16
    mritd  
       2018-03-22 16:09:01 +08:00
    我还以为给我讲 JVM 优化的...开心的一比
    huclengyue
        17
    huclengyue  
       2018-03-22 17:27:36 +08:00 via Android
    kotlin 了解一下
    kaneg
        18
    kaneg  
       2018-03-22 18:12:39 +08:00 via iPhone
    上 kotlin 吧,现在选择 grovvy 有点 49 年参加国民党的感觉
    notreami
        19
    notreami  
       2018-03-23 13:20:59 +08:00
    @kaneg 上 java10 吧,现在选择 kotlin 有点 18 年提八荣八耻的感觉
    jeffreyning
        20
    jeffreyning  
       2018-11-02 13:06:46 +08:00
    公司在用 groovy 结合 springboot 开发,效率很高。接口层用的都是 springboot、springmvc 和 springcloud 的注解,业务实现用的 groovy 写速度快还支持热部署,没有用 grails 框架,用的这个 groovy 框架 micro-mvc,比 grails 胜在兼容性强,兼容 spring 体系各种 mvc 框架。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:49 · PVG 04:49 · LAX 12:49 · JFK 15:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.