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

2018-03-22 08:47:19 +08:00
 hansonwang99


为什么要学 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 install groovy

groovy -v

一切就绪


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 语言特性

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


从 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', {...})

后记

作者更多的原创文章在此

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

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

google android 开发官方推特上现在天天发 kotlin 的奇技淫巧。
RubyJack
2018-03-22 16:04:01 +08:00
动不动就高性能,高并发什么的,歪风邪气也不知道谁带起来的
mritd
2018-03-22 16:08:39 +08:00
"构建高性能 JVM 应用"
???
mritd
2018-03-22 16:09:01 +08:00
我还以为给我讲 JVM 优化的...开心的一比
huclengyue
2018-03-22 17:27:36 +08:00
kotlin 了解一下
kaneg
2018-03-22 18:12:39 +08:00
上 kotlin 吧,现在选择 grovvy 有点 49 年参加国民党的感觉
notreami
2018-03-23 13:20:59 +08:00
@kaneg 上 java10 吧,现在选择 kotlin 有点 18 年提八荣八耻的感觉
jeffreyning
2018-11-02 13:06:46 +08:00
公司在用 groovy 结合 springboot 开发,效率很高。接口层用的都是 springboot、springmvc 和 springcloud 的注解,业务实现用的 groovy 写速度快还支持热部署,没有用 grails 框架,用的这个 groovy 框架 micro-mvc,比 grails 胜在兼容性强,兼容 spring 体系各种 mvc 框架。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/440283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX