Groovy学习笔记2:Groovy的基本语法

1、Java和Groovy对比

1.1、Hello Groovy!

从一个简单的案例开始:

class A01_GroovyApp {

    public static void hello() {
        println('Hello Groovy!')
    }

    public static void main(String[] args) {
        hello()
    }
}

运行结果

Hello Groovy!

1.2、如何实现循环

简单的,可以类似Java一样这样写:

Stream.of(1, 2, 3, 4)
        .forEach(new Consumer<Integer>() {
    @Override
    void accept(Integer integer) {
        println("Java print" + integer)
    }
})

运行结果

Java print1
Java print2
Java print3
Java print4

也可以这样写

for (i in 0..4)  {    //方式1
    print "$i"
}

println()

0.upto(4) { print "$it" }  //方式2

println()

3.times { print("$it") }   //方式3

println()

0.step(10, 2) { print("$it") }   //方式4

运行结果:

01234
01234
012
02468

1.3、初识GDK

Java中,假如我们想要在代码中调用SVN的help,我们应该这样实现Java代码:

SVN_Java.png

在groovy中,我们只需要这样实现:

println "svn help".execute().text

//或者执行 groovy -v命令查询groovy的版本
println "groovy -v".execute().text

//或者执行 ls -l命令
println "ls -l".execute().text

结果:

java.lang.UNIXProcess

Groovy Version: 2.4.15 JVM: 1.8.0_131 Vendor: Oracle Corporation OS: Mac OS X

total 128
-rw-r--r-- 1 qing.mei staff 23 Mar 29 20:11 A00_Helloworld.groovy
-rw-r--r-- 1 qing.mei staff 232 Apr 4 20:04 A01_GroovyApp.groovy
-rw-r--r-- 1 qing.mei staff 50 Mar 29 20:29 A02_GroovyScript.groovy
-rw-r--r-- 1 qing.mei staff 383 Apr 4 20:09 A03_foreach.groovy
-rw-r--r-- 1 qing.mei staff 114 Mar 30 17:33 A04_GDK.groovy
-rw-r--r-- 1 qing.mei staff 93 Mar 30 19:27 A05_Exception.groovy
-rw-r--r-- 1 qing.mei staff 250 Mar 30 19:29 A06_Wizard.groovy
-rw-r--r-- 1 qing.mei staff 29 Mar 30 19:29 A06_Wizard_Script.groovy
-rw-r--r-- 1 qing.mei staff 125 Mar 30 19:36 A07_GroovyBean.groovy
-rw-r--r-- 1 qing.mei staff 188 Mar 30 19:36 A07_GroovyBean_Script.groovy
-rw-r--r-- 1 qing.mei staff 387 Mar 30 19:36 A07_JavaBean.java
-rw-r--r-- 1 qing.mei staff 299 Apr 4 19:25 A08Calendar.groovy
-rw-r--r-- 1 qing.mei staff 188 Apr 4 19:33 A09Robot.groovy
-rw-r--r-- 1 qing.mei staff 200 Apr 4 19:31 A09RobotScript.groovy
-rw-r--r-- 1 qing.mei staff 524 Apr 4 19:44 A10Params.groovy
-rw-r--r-- 1 qing.mei staff 1540 Apr 4 20:01 A11MultipleAssignments.groovy

2、JavaBean

相比Java的get和set方法,我们来看Groovy的JavaBean:

class A07_GroovyBean {

    def name = 'qingmei2'
    final year

    A07_GroovyBean(year) {
        this.year = year
    }
}

其操作方式:

def groovyBean = new A07_GroovyBean(10)

println "year: $groovyBean.year"
println "name: $groovyBean.name"
println 'Setting...'
groovyBean.name = "LiHua"
println "name: $groovyBean.name"

执行结果:

year: 10
name: qingmei2
Setting...
name: LiHua

同时,还可以这样节省代码:

//我们可以这样代替Java的Calendar.getInstance()
Calendar.instance

str = 'hello'

//谨慎使用class属性,类似Map/生成器等一些类对该属性有特殊处理,因此为了避免意外,一般使用getClass()
def name = str.class.name

println "the string = $str"
println "the string class name = $name"

3、灵活初始化和具名参数

Groovy中可以灵活地初始化一个JavaBean类。在构造对象时,可以简单地以逗号分隔的名值对来给出属性值。如果类有一个无参构造器,该操作会在构造器之后执行。1也可以设计自己的方法,使其接受具名参数。要利用这一特性,需要把第一个形参定义为Map。下面通过代码来实际地看一下。

class A09Robot {

    def type, height, width

    def access(Map location, weight, fragile) {
        println "received fragile ? $fragile, weight: $weight, location: $location"
    }
}
def robot = new A09Robot(type: 'arm', width: 10, height: 40)
println "$robot.type, $robot.width, $robot.height"

robot.access(x: 30, y: 20, z: 10, 50, true)
robot.access(50, true, x: 30, y: 20, z: 10)

我们来看结果:

arm, 10, 40
received fragile ? true, weight: 50, location: [x:30, y:20, z:10]
received fragile ? true, weight: 50, location: [x:30, y:20, z:10]

4.可选形参

参考Kotlin,我们可以给函数的参数设置默认的值:

//groovy 可以把方法和构造器形参设置为可选择的
//但是这些形参必须位于形参列表的末尾
def log(x, base = 10) {
    Math.log(x) / Math.log(base)
}

println log(1024)
println log(1024, 10)
println log(1024, 2)

//同时,groovy还会把末尾的数组形参视作可选的
//因此,可以为最后一个形参提供0个或者多个值
def task(name, String[] details) {
    println "$name - $details"
}

task 'call', '123-456-7890'
task 'call', '123-456-7890', '234,567,890'
task 'checkmail'

结果:

3.0102999566398116
3.0102999566398116
10.0
call - [123-456-7890]
call - [123-456-7890, 234,567,890]
checkmail - []

5.使用多赋值

向方法传递多个参数,这在很多编程语言中都司空见惯。但是从方法返回多个结果,尽管可能非常实用,却不那么常见。

要想从方法返回多个结果,并将它们一次性赋给多个变量,我们可以返回一个数组,然后将多个变量以逗号分隔,放在圆括号中,置于赋值表达式左侧即可。

后面的例子中有一个负责将全名分割为名字(FirstName)和姓氏(LastName)的方法。不出所料,split()方法就返回一个数组。可以把splitName()的结果赋给一对变量:firstName和lastName。Groovy会把结果中的两个值分别赋给这两个变量。

def splitFullName(String fullname) {
    fullname.split ' '
}

def (firstname, lastname) = splitFullName('James Bond')

println "$lastname, $firstname $lastname"

结果:

Bond, James Bond

还可以使用该特性来交换变量,无需创建中间变量来保存被交换的值,只需将欲交换的变量放在圆括号内,置于赋值表达式左侧,同时将它们以相反顺序放于方括号内,置于右侧即可。

//交换值的方式

def name1 = 'name1'
def name2 = 'name2'

println "$name1 and $name2"

(name1, name2) = [name2, name1]

println "$name1 and $name2"

结果:

name1 and name2
name2 and name1

此外,当变量与值的数目不匹配时,如果有多余的变量,groovy会把它们设置为null,多余的值则会被丢弃:

//仍然是上面的名字分割案例
def (names) = splitFullName('James Bond')
println "$names"

//左侧只有两个变量,因此Spike和Tyke会被丢弃
def (String cat, String mouse) = ['Tom', 'Jerry', 'Spike', 'Tyke']
println "$cat and $mouse"

def (String first, String second, String third) = ['Tom', 'Jerry']
println "$first and $second and $third"

结果:

James //多余的值则会被丢弃
Tom and Jerry
Tom and Jerry and null //多余的变量,groovy会把它们设置为null

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容