Groovy入门

变量定义

groovy 是动态类型的语言,也就是说不需要指定变量的类型,类型是可以值来推导的。

  • 不指定类型定义变量: i = 10
  • 使用关键字def,虽不是必须的,但是为了代码清晰,还是建议使用 def 关键字定义变量 def i = 10

这里有个误区:def 关键字的出现时替代变量类型的占位符,如果你已经明确了变量的类型,就没必要使用 def,也就是说 def int i = 10 是没有必要的

字符串

  • 单引号:单引号中的内容严格对应 Java 中的 String
  • 双引号:和脚本语言类似,如果字符串中有符的话,先对表达式进行求值
  • 三引号:针对的是很长的字符串,只要在三引号之间,可以随意换行
def s1 = 'hello'

def s2 = "string append ${version + 1}"

def s3 = '''随意
换行
打印
'''

字符串的长度:s1.size()

字符串的访问:s1[2] //被当做数组来处理;

或者 s1.getAt(index)

字符串的重复:

s = s1*3 // 代表是将 s1 拼接三次

函数定义

  • 参数可以不指定类型
  • 方法体中可以不使用 return 来返回,这样默认的返回值就是最后一行语句的值,但是如果不指定 return,定义函数时必须要使用 def。
  • 可以指明返回值类型,这样就可以省略 def 关键字;但是如果未指定返回值类型,那么定义函数时必须使用 def 关键字
  • 默认参数:可以给参数定义默认值,但是要注意的是,如果要定义有默认值的参数,那么该参数必须在参数列表的末尾
int sum(int a,int b = 0){
    return a + b;
}

sum(1,2)
sum(1)

函数调用

  • 调用时,可以不加括号,但这并不是一个好的习惯,因为如果一个函数是无参的,那么不带括号,很可能被误认为是属性的调用;同时在嵌套函数调用时,也容易出错(将参数设置为另一个方法调用的结果)
  • 最好的一种形式是:能加括号都加括号;如果该方法只有一个参数,那么调用时加括号,如果有多个参数,则可以省略括号
  • 特别注意:如果该函数没有参数,那么调用时,必须加括号;同时这个的参数个数要和闭包的参数个数区分开

Groovy bean 对象

class  Bean{
    int version
    String name;

    Bean(int version,String name){
        this.version = version;
        this.name = name;
    }
}

Bean bean1 = new Bean(1,"zx")

println bean1.name

上面定义的 Bean 对象,在其内部定义了两个成员变量 version 和 name,这样默认就会为我们生成其对应的 getter 和 setter 方法。而在外部访问该成员变量时,其实是调用对应的 getter 和 setter 方法。

闭包

闭包和函数是类似的,是一个代码片段,可以定义一个引用指向这个闭包,这类似于 C 语言中的函数指针;

闭包还可以获取外部变量;与 Java 中的内部类不同的是,在闭包内不仅可以获取到外部变量,同时也可以将其修改,修改对外部是可见的。

与函数定义不同的是,闭包的参数是在方法体内定义的,以 -> 分割,左侧为参数,右侧为方法体

闭包方法体内,最后一句为返回值。

闭包的默认参数:如果定义的闭包只有一个参数,那么可以在闭包内直接写方法体,使用 $it 来获取参数。

如果要定义一个没有参数的闭包,那么闭包内, -> 左侧为空,则代表该闭包没有参数

Groovy 中的函数,可以用闭包作为参数;

集合类

groovy 中的集合包含两种:list 和 map,其使用也很简单

list = [0,1,2]
list << 3
println list.size();

map = [name:"zx",age:25];
map.merry = false   // 向 map 添加键值对
println map.size()  // 3

运算符

  • 范围运算符(..)
//range 更像是一个数组,其长度为 6,其为从 5 到 10
def range = 5..10
//通过 get(index)来获取对应的值
println range.get(2)

// 其它实例
1 .. <10    //  独占范围的示例
'a'..'x'   // 范围也可以由字符组成
10..1     // 范围也可以按降序排列
'x'..'a' // 范围也可以由字符组成并按降序排列。

// 由此就有如下 foreach 的写法
for(int i in 1..5) {
    println(i);
}
  • 三目运算符(?:)
// 假设有这样一个需求,如果 name 不为 null,那么就输出 name 的值,否则输出 Anonymous
// 下面的三目运算符的写法,未免有些啰嗦
displayName = name ? name : 'Anonymous'

// 下面是 groovy 中支持三目运算符的写法
displayName = name ?: 'Anonymous'
  • 展开操作符(*.)

应用于实现了 iterator 的对象中,一般是数组,集合,是 foreach 的缩写

def technologies = ['Groovy','Grails','Gradle']
technologies*.toUpperCase() // = to technologies.collect { it?.toUpperCase() }
  • 安全操作符(?.)

可以有效的避免空指针

// eg:get(1)返回的结果是 null,此时如果调用 user.username 会产生空指针异常
//而是用 ?. 如果 user 为空,那么 username 也为 空,不会产生空指针异常
def user = User.get(1)
def username = user?.username

文件操作

groovy 提供了比 Java 更为便捷的方法来操作文件,其API 文档参考

File file = new File("E:/hello.txt")
//按行读文件 
file.eachLine {  
   line -> println "line : $line"; 
} 

//读取文件的整个内容,是用 text 熟悉
println  file.text

//获取文件内同的大小,单位是字节
println file.length()

// 写入文件,内容为 hello world
file.withWriter('utf-8') { 
    writer -> writer.writeLine 'Hello World' 
}  

//复制文件
def src = new File("E:/hello.txt")
def dst = new File("E:/hello1.txt")
dst << src.text

//递归显示目录及其子目录中的所有文件
file.eachFileRecurse() {
    file -> println file.getAbsolutePath()
}

参考

官方手册
Learn groovy in Y minutes
使用 Groovy 开发之新特性
日积月累--Groovy 语言规范之操作符
Groovy 学习之-运行时元编程
精通 Groovy

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

推荐阅读更多精彩内容

  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,327评论 1 5
  • 什么是 Groovy? 简言之,Groovy是一种基于JVM(Java虚拟机)的敏捷动态开发语言。它是一种成熟的面...
    北纬26阅读 4,107评论 0 14
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,123评论 9 118
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,517评论 18 139
  • 三个月前自己读完了《幸福的方法》,今天通过樊登读书会,听樊登老师讲述了他对这本书的理解,整理了一下,与大家分享! ...
    陆可叔叔阅读 372评论 0 3