Groovy - 基本特性
有别于java的一些方面
-
Groovy 可以省略分号和修饰符(类以及方法的修饰符)。
-
默认情况下,Groovy 的所有内容都为 public。
-
Groovy 允许定义简单脚本,同时无需定义正规的 class 对象。比如可以通过 groovyconsole打开groovy的控制台,可以直接跑
println "hello"
-
Groovy 在普通的常用 Java 对象上增加了一些独特的方法和快捷方式,使得它们更容易使用。比如对于集合的操作。
-
Groovy 语法还允许省略变量类型,具有类型推断,可以很据具体指推断出变量的类型,难以推断时也可以把变量当成Object。 无类型导致groovy不需要使用接口或者抽象类。
-
方法的默认值:可以给方法设置默认值 eg:
def addFun(a, b=4)
集合相关的操作
-
范围也算集合:
def range = 0..4 range instanceof List
-
def listDemo = ["aa", "bb", "cc"]
其实就是一个java里面的ArrayList -
list相关的操作:
- 赋值操作:
- listDemo("dd")
- listDemo << "ee"
- listDemo[5] = "ff"
- 取值操作:
- listDemo[2] == "cc"
- 对集合元素的增减操作
- def numbers = [1,2,3,4]
- numbers + 5 == [1,2,3,4,5]
- numbers - [1,2] == [3,4]
- 便捷的转换方法:
- numbers.join(",") == "1,2,3,4"
- [1,2,3,4,4].count(4) == 2
- 赋值操作:
-
map相关的:
- def mapDemo = [name:"Allen", age:"18"]
- 赋值操作:
- mapDemo.put("id", 2015), 这种写法,key需要“”。
- mapDemo.id = "2015" 这种写法,key不需要“”, 但是groovy会把它转化成String类型.
*取值操作 - 使用 . 的操作,也可以进行取值操作。eg: mapDemo.id == "2015"
- mapDemo["name"] == "Allen" , 使用[]取值的话,key需要使用String
闭包
-
对集合的操作
def userList = ["allen", "mike", "jack"] userList.each{ println it } //it 默认是迭代的对象,也可以重新指定key,如下 userList.each{user -> println user } //当然如果是想遍历一个map的话,也类似 def mapDemo = [name:"Allen", age:"18"] mapDemo.each{key, value -> println "${key} = ${value]" }
-
一个闭包也是一个变量
def sayHello = { name -> return "Hello! ${name}" } //闭包的两种调用方式 assert "Hello! Allen" == sayHello("Allen") assert "Hello! Allen" == sayHello("Allen").call()
对类的操作
-
会自动拥有 getter/setter 方法 和构造函数
-
属性都可以使用 def来定义,而且都是私有的, 自动拥有的方法中的参数类型是 Object类型。
-
如果是写一个override的方法,需要显示的写明返回类型
-
最简单的一个类的定义如下:
class User { def name def age def id }
-
直接使用构造函数
def userInstant = new User("Allen", 18, "2015")
-
赋值:
userInstant.name = "Allen" userInstant.setName("Allen")
-
groovy里面的方法调用支持不写括号,上面这句赋值语句可以写成:
userInstant.setName "Allen" //这样写,个人感觉不利于读代码
-
取值:
assert userInstant.name == "Allen" assert userInstant.getName() == "Allen"
-
方法返回值以及对于NPE的处理
-
groovy 里面方法的返回值如果不显示的写return语句,则最后一行语句作为返回值
String hello(name){ "Hello! ${name}" } //这个hello()方法体中并没有出现return, groovy会把 “Hello! ${name}”作为返回值,并且也可以表明这个方法的返回类型是 String
-
groovy对于非空的的判断,只需要简单的加一个问号 ?就可以了
//比如在写了一个 getName() 的方法如下: def getUserUpCaseName(){ userInstant.name.toUpperCase() } //如果在调用这个方法的时候 userInstant中的name属性还没有赋值,那么显然会出现NPE的问题。 //在groovy里面我们可以写成下面这样,就没有问题了 def getUserUpCaseName(){ userInstant.name?.toUpperCase() }
老司机带你飞