groovy基本概念学习笔记

groovy是一种基于JVM的动态语言,能够与java代码很好地结合,可以使用Java语言编写的库。

这里记录一下groovy的一些学习笔记。

1.groovy可以使用def定义一个变量,使用def其实就是表示这个对象的类型是Object:

def num = 1
def str = "format"
def today = new Date()

而在java中,由于java是静态语言,因此java定义变量的时候必须指明变量的类型。

2.groovy中 “==” 符号相当于java中的 “equals” 方法, groovy中的 “is” 方法相当于java中的 “==”

new Date() == new Date()   // true
new Date().is(new Date())  // false

3.groovy中可以使用 “[]” 表示数组或链表, “[:]” 表示map。

[1,2,3] // 表示包含一个ArrayList实例
["1":"a", "2":"b"] // 表示一个map

4.可以使用dump方法查看当前实例的具体信息

["1":"a", "2":"b"] // <java.util.LinkedHashMap@a0 head=1=a tail=2=b accessOrder=false table=[null, 1=a, 2=b, null] entrySet=[1=a, 2=b] size=2 modCount=2 threshold=3 loadFactor=0.75 keySet=null values=null>

5.groovy会默认import一些包。

java.io.*
java.lang.*
java.math.BigDecimal
java.math.BigInteger
java.net.*
java.util.*
groovy.lang.*
groovy.util.*

而java只会默认import java.lang.*

6.java空对象调用方法会报错,因此需要加上逻辑判断一些非null对象,而groovy可以使用?.符号:

instance?.method()

而在java中需要这么写:

if(instance != null)
    instance.method()

7.groovy提供了一种叫做GString的概念。

"${name}, nice to meet you!"

上面这段字符串就是个GString,字符串中的${name}会被自动解析成name变量所表示的值。

8.闭包

闭包应该是最大的区别了。 动态语言都有闭包这个概念,而静态语言没有。

java遍历map的时候需要得到map的keySet,然后使用for遍历:

Set<String> keySet = map.keySet();
for(String str : keySet) {
    ...
}

groovy中的闭包:

map.each {
    key, value -> ....
}  

list也可以使用闭包:

list.eachWithIndex {
    value, index -> ...
}

如果闭包内只有1个属性,那么这个属性可以不写,默认为it:

[5,6,7].each {
    println it
}

等于:

[5,6,7].each {
    num -> println num
}

9.范围range

groovy中可以使用1..3这个range,表示[1,2,3]。 1..3也可以写成 1..<4

10.list实用方法

list的findAll方法,find方法,groupBy方法。

找出30岁的人,返回值也是一个List

list.each {
  it.age == 30  // 注意是==。 如果用=的话不会报错,但是有时候会出现莫名其妙的错误,很难找。
}

根据年龄分组,返回值是一个Map,key是age,也就是年龄,value是一个list

list.groupBy {
  it.age
}

11.日期实用方法

昨天和明天的获取:

def now = new Date()
def tomorrow = now + 1
def yesterday = now - 1

根据时分秒设置时间:

def now = new Date()
now.set([hourOfDay: 1, minute: 30, second: 45])

12.metaClass的使用

groovy不像javascript,javascript中定义一个对象,然后可以给这个对象的实例动态地插入任何属性和方法。

groovy定义好了一个类,如何给这个类的实例动态地添加属性和方法呢, 那就是使用metaClass。

class Person {
  String name
  int age
}

Person p = new Person()
p.hobby = 'music' // 会报错,因为Person类没有hobby属性
p.metaClass.hobby = 'music' // 不会报错,动态添加属性
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
本文作者:Format
原文链接: http://fangjian0423.github.io/2015/02/06/groovy_note/
版权归作者所有,转载请注明出处