groovy 基础总结

最近因为工作需要,接触groovy,很好的语言。以前学习过python,感觉没有用到的地方,现在用groovy有了深入学习的理由,和java的无缝衔接技术。

 

入门很简单,而且做了一个小脚本,比较几个数据库的表结构,将结果保存在excel中,用groovy代码才不到1K行,使用了POI,derby,oralce数据库等。不用创建很罗嗦的pojo,太好了。

 

这里就先整理一下基础的groovy东西。全部来自附件文档,然后自己粘贴出来而已。

 

 

字符串类型的方法:

 

Groovy代码   收藏代码
  1. def firstname='Kate'  
  2. def surname='Bush'  
  3. //打印字符串的连接  
  4. println firstname*2  
  5.   
  6. def fullname="$firstname $surname"  
  7. println fullname  
  8. println fullname-firstname  
  9. //凑足15个字符,不够就在左边补充空格  
  10. println fullname.padLeft(15)    
  11.   
  12. //关于字符串的截取  
  13. println fullname[0..3]  
  14. println fullname[-4..-1]  
  15. //下面的方式比较特别,取第5个字符,以及3,2,1位置字符连接起来  
  16. assert fullname[5,3..1]=='Beta'  
  17.   
  18. ff='aaaabbccadvbasd'  
  19. lines=ff.split('a')  
  20. //下面assert在后面表达式为false情况下抛出异常  
  21. assert lines.size()==7  
  22.   
  23. //注意字符串中的特殊字符  
  24. def plain='\n\r\t\b\\\f\$'  
  25. assert plain.size()==7  
  26.   
  27. //关于字符串的闭包(注意下面的括号的使用方法!)  
  28. fullname="${-> firstname} $surname"  
  29. println fullname  
  30. firstname = 'li'  
  31. surname='shuiqing'  
  32. println fullname  
  33.   
  34. //关于字符串的运算符  
  35. fullname = fullname -'qing'-'l'+' hello world'  
  36. assert fullname=='i Bush hello world'  
  37.   
  38. //字符串替换  
  39. string = 'hippopotamus'  
  40. assert string.replace('ppopotam','bisc') == 'hibiscus'  
  41.   
  42. //字符串反转,转换为list  
  43. assert'apple'.toList() == ['a''p''p''l''e']  
  44.   
  45. //下面把字符串里面去掉重复数字,并排序.  
  46. string = "an apple a day"  
  47. assert string.toList().unique().sort().join() == ' adelnpy'  
  48.   
  49. //下面方法取出得到字符串里面的各个单词,并进行反转  
  50. string = 'Yoda said, "can you see this?"'  
  51. revwords= string.split(' ').toList().reverse().join(' ')  
  52. assert revwords== 'this?" see you "can said, Yoda'  
  53. println revwords  
  54.   
  55. //对数组进行筛选,找出反转之后还等于原来字符串并且长度大于5的字符串  
  56. words = ['bob''alpha''rotator''omega''reviver']  
  57. bigPalindromes= words.findAll{w-> w == w.reverse() && w.size() > 5}  
  58. assert bigPalindromes== ['rotator''reviver']  
  59. println bigPalindromes  
 

数字方法:

 

Groovy代码   收藏代码
  1. def x=3  
  2. def y=4  
  3. println x+y  
  4. println x.plus(y)                  
  5. println x instanceof Integer   //输出true  
  6.   
  7. def a=2/3  
  8. //进行小数的取三位小数运算.  
  9. def b = a.setScale(3,BigDecimal.ROUND_HALF_UP)  
  10. assert b.toString() == '0.667'  
  11.   
  12. //进行不等于的比较  
  13. println 4<=>3     //输出1  
  14.    4!=3  
  15.     
  16. println 4**3      //43次方,等于4.power(3)  
  17. println 4/3       //输出1.3333333333,等于4.div(3)  
  18. println 8.intdiv(3)     //输出1  
  19. println 8%3          //取余,等于8.mod(3)  
 

 

日期函数:

 

 

Groovy代码   收藏代码
  1. import static java.util.Calendar.getInstance as now  
  2. import org.codehaus.groovy.runtime.TimeCategory  
  3. import java.text.SimpleDateFormat  
  4.   
  5. def date = new Date()+1  
  6. println date  
  7.   
  8. input = '1998-06-03'  
  9. df1 = new SimpleDateFormat("yyyy-MM-dd")  
  10. date = df1.parse(input)  
  11. df2 = new SimpleDateFormat("MMM/dd/yyyy")  
  12. println 'Date was '+df2.format(date)  
  13.   
  14. println now().time  
  15.   
  16. println  df1.format(now().time)  
  17.   
  18. //进行时间的计算  
  19. use(TimeCategory){  
  20.     date3 =  new Date()+1.year+3.hours-2.days  
  21.     println df1.format(date3)  
  22. }  
  23.   
  24. /*  
  25. Tue Apr 10 14:59:33 CST 2012  
  26. Date was 六月/03/1998  
  27. Mon Apr 09 14:59:33 CST 2012  
  28. 2012-04-09  
  29. 2013-04-07  
  30. */  
 

操作符重载:

 

 

Groovy代码   收藏代码
  1. //下面演示对字符串实现了操作符++的重载.++对应的方法名是next  
  2.  for ( i='a';i<'d';i++)  
  3.    print i +", "  
  4.    
  5.  println ''  
  6.      
  7.  for( i in 'a'..'d')  
  8.   print i+", "  
  9.     
  10.   //下面演示的对于集合,重载了操作符<<,对应的方法名是leftShift()  
  11.   lst = ['hello']  
  12.   lst << 'there'  
  13.   println lst  
  14.     
  15.   //下面演示对一个自定义类实现的+的重载。  
  16.   class ComplexNumber{  
  17.       def real,imaginary  
  18.         
  19.       def plus(other){  
  20.           new ComplexNumber(real:real+other.real,  
  21.                imaginary:imaginary+other.imaginary)  
  22.       }  
  23.         
  24.       String toString(){  
  25.           "$real ${imaginary>0 ? '+':''}${imaginary}i"  
  26.       }  
  27.   }  
  28.     
  29.   c1 = new ComplexNumber(real:1,imaginary:2)  
  30.   c2 = new ComplexNumber(real:4,imaginary:-31)  
  31.     
  32.   println c1+c2  
 
操作数据库
Groovy代码   收藏代码
  1. import groovy.sql.Sql  
  2. def testYear = '2011'  
  3. //下面的Driver类找不到!修改配置文件就可以了。  
  4. def sql = Sql.newInstance("jdbc:mysql://localhost:3306/dwz","root","123456"  
  5.     ,"com.mysql.jdbc.Driver")  
  6. println '数据库名:'+sql.connection.catalog  
  7.   
  8.      
  9. sql.execute("delete from testtable where name like ? or name like ? or name like ?",['ls%','lish%','%dataSet%'])   
  10.   
  11. println '插入我的数据之前,数据库:'  
  12. sql.eachRow("select * from testtable"){  
  13.     println "id = ${it.id}   year = ${it.name}  "+it.name  
  14. }  
  15. println '--------------------------------------'  
  16. wid = 123  
  17. wname = 'lishuiqing'  
  18. //下面必须使用双引号!  
  19. sql.execute("insert into testtable(id,name) values (${wid},${wname})")   
  20.   
  21. sql.execute("update testtable set name =? where name = ?",['lsq','lishuiqing'])  
  22.   
  23. //下面使用预定义参数的查询语句  
  24. sql.eachRow("select * from testtable where name like ?",["%a%"]){  
  25.     println "id = ${it.id}   year = ${it.name}  "+it.name  
  26. }  
  27. println '--------------------------------------'  
  28.   
  29. println '下面练习使用dataset'  
  30. testtable = sql.dataSet('testtable')  
  31.   
  32. /*def anycity = testtable.findAll{ it.id>1 }  
  33. anycity.each{  
  34.     println 1  
  35. }*/  
  36.    
  37. 2.times{  
  38.     testtable.add(id:it,name:'使用dataSet添加'+it)  
  39. }  
  40.   
  41. println "testtable.getSql():"+testtable.getSql()  
  42. println '总行数:'+testtable.rows().size()  
  43.    
  44.   
  45. num = 0  
  46. testtable.each{   
  47.     //println it[0]----也可以输出指定位置的元素!!  
  48.     num = num+1  
  49.     println it.id+",year="+it.name  
  50. }  
  51. //注意要使用${}输出参数的话,必须使用双引号。。。  
  52. println "${num}"  
  53.   
  54. println '--------------------------------------'  
  55. println "下面显示当前数据库的运行实时状态"  
  56. sql.eachRow("show status "){  
  57.     //下面在{}里面定义的变量,在外面也找到,也就是作用域是全部的范围!!  
  58.     if(it.variable_name=="Uptime")  
  59.         uptime = it[1]  
  60.     else if (it.variable_name =='Questions')  
  61.         questions = it[1]  
  62. }  
  63. println "数据库运行时间Uptime for Database:${uptime}"  
  64. println "数据库查询的条目Number of Queries:${questions}"  
  65. println "每分钟的查询条目Queties per Minutes = "+Integer.valueOf(questions)/Integer.valueOf(uptime)  
  66.   
  67. sql.eachRow("show status like 'Com_%'"){  
  68.     if(it.variable_name=="Com_insert")  
  69.         insertnum = Integer.valueOf(it[1])  
  70.     else if (it.variable_name == "Com_select")  
  71.         selectnum = Integer.valueOf(it[1])  
  72.     else if (it.variable_name == "Com_update")  
  73.         updatenum = Integer.valueOf(it[1])  
  74. }  
  75. println "查询语句有${selectnum},百分比:"+100*(selectnum/Integer.valueOf(uptime))+"%"  
  76. println "插入语句有${insertnum},百分比:"+100*(insertnum/Integer.valueOf(uptime))+"%"  
  77. println "更新语句有${updatenum},百分比:"+100*(updatenum/Integer.valueOf(uptime))+"%"  
  78.   
  79. println '--------------------------------------'  
  80. println '下面将数据库里面的值保存到xml文件'  
  81. bldr = new groovy.xml.MarkupBuilder()  
  82. bldr.testtable{  
  83.     sql.eachRow('select * from testtable'){  
  84.         data(id:it.id,name:it.name)  
  85.     }  
  86. }  
  87. println bldr.text()  
 集合
Groovy代码   收藏代码
  1. List  
  2.   
  3. assert [1,2,3,4] ==(1..4)  
  4. //集合是有顺序的!!  
  5. assert [1,2,3,4] !=[1,2,4,3]  
  6. assert [1,2,3]+[1] ==[1,2,3,1]  
  7. //将一个元素添加到已经存在的list中  
  8. assert [1,2,3]<<1 ==[1,2,3,1]  
  9. //从已有的list中删除元素  
  10. assert [1,2,3,1]-[1] ==[2,3]  
  11. assert [1,2,3]*2 ==[1,2,3,1,2,3]  
  12. //flatten:扁平的意思  
  13. assert [1,[2,3]].flatten() ==[1,2,3]  
  14. assert [1,2,3].reverse()==[3,2,1]  
  15. //测试两个集合是否有交叉  
  16. assert [1,2,3].disjoint([4,5,6])  
  17. //intersect:得到两个集合中的交集  
  18. assert [1,2,3].intersect([4,3,1]) ==[3,1]  
  19. //对集合进行循环处理  
  20. assert [1,2,3].collect{it+3} ==[4,5,6]  
  21. assert [1,2,3,1].unique().size()==3  
  22. assert [1,2,3,1].count(1) ==2  
  23. assert [1,2,3,4].min() ==1  
  24. assert [1,2,3,4].max() ==4  
  25. assert [1,2,3,4].sum() ==10  
  26. assert [4,2,1,3].sort() ==[1,2,3,4]  
  27. //对集合进行循环处理判断,并返回结果  
  28. assert [4,2,1,3].findAll{it%2==0} ==[4,2]  
  29.   
  30. //对集合的迭代  
  31. def expected = [1,2,3,'test']  
  32. expected.each{test -> println test}  
  33.   
  34.   
  35. Map:  
  36.   
  37. def map = [a:1,'b':2]  
  38. println map    //[a:1, b:2]  
  39. println map.a  
  40. println map['a']  
  41. println map.keySet()  //[a, b]  
  42.    
  43. map = [:]  
  44. map[1] = 'a';map[2]='b'  
  45. map[true] = 'p'  
  46. map[false] = 'q'  
  47. map[null]='x';map['null'] = 'z'  
  48. assert map ==[1:'a',2:'b',(true):'p',(false):'q',(null):'x'  
  49.     ,'null':'z']  
  50.   
  51. //下面的例子很有用,对map进行了很快速的循环输出!!  
  52. def sb = new StringBuffer();  
  53. [1:'a',2:'b',3:'c'].each{k,v->sb << "$k:$v, "}  
  54.   
  55. //下面是输出字符串  
  56. [1:'a',2:'b',3:'c'].each{k,v-> println "$k:$v, "}  
  57.   
  58. assert sb.toString() =='1:a, 2:b, 3:c, '  
  59.   
  60. //下面又是一种快速的输出map为字符串形式的方法  
  61. map = [1:'a',2:'b',3:'c']  
  62. def string = map.collect{k,v -> "$k:$v"}.join(', ')  
  63. assert string == '1:a, 2:b, 3:c'    
  64.    
  65. //下面演示一个对city进行分类的例子  
  66. assert [  
  67.     [name:'C',city:'London'],  
  68.     [name:'S',city:'London'],  
  69.     [name:'M',city:'LA'],  
  70.     [name:'Z',city:'HK'],  
  71.     [name:'A',city:'HK']          
  72. ].groupBy{it.city}==[  
  73.     London:[ [name:'C',city:'London'],  
  74.     [name:'S',city:'London']],  
  75.     LA:[ [name:'M',city:'LA']],  
  76.     HK:[ [name:'Z',city:'HK'] ,  
  77.     [name:'A',city:'HK'] ]  
  78. ]  
  79.   
  80. //map中顺序也是有关系的!顺序不对的map也不相等  
  81. assert [ [name:1,city:'L'],[name:2,city:'H']] != [ [name:2,city:'H'],[name:1,city:'L']]  
 闭包

Groovy代码   收藏代码
  1. 闭包的一个例子:  
  2.   
  3. import static java.lang.Math.*  
  4.   
  5. //闭包例子1  
  6. piA = { 22/7 }  
  7. piB = { 333/106 }  
  8. piC = { 355/113 }  
  9. piD = { 0.6*(3+sqrt(5))}  
  10. piE = { 22/7 +37/47 +888/83}  
  11. piF = { sqrt(sqrt(2143/22)) }  
  12.   
  13. //这里就是闭包的实际算法部分。  
  14. howCloseToPI = { abs(it.value() - PI) }  
  15.   
  16. algorithms = ['piA':piA,'piB':piB,'piC':piC,'piD':piD,'piE':piE,'piF':piF]   
  17.   
  18. findBestPI(algorithms)  
  19.   
  20. def findBestPI(map){  
  21.     map.entrySet().sort(howCloseToPI).each{  
  22.         entry ->//下面调用了闭包的函数  
  23.         def diff = howCloseToPI(entry)  
  24.         println "Alorithm $entry.key differs by $diff"  
  25.     }  
  26. }  
  27.   
  28. doubleNum = {num ->num*2}  
  29. println doubleNum(3)  
  30.   
  31. //闭包例子2  
  32. //下面的方法定义就是使用了闭包。传入了num,closure,其中closure是函数类型。  
  33. processThenPrint = {num,closure->  
  34.   num = closure(num);println "num is $num"  
  35. }  
  36. //下面传入了函数名作为第二个参数  
  37. processThenPrint(3,doubleNum)  
  38. //下面传入第二个参数是匿名函数  
  39. processThenPrint(10){it/2}  
  40.   
  41. //闭包例子3  
  42. //下面又是一个闭包的例子  
  43. def houston(Closure  doit){  
  44.    (10..1).each{  
  45.        count -> doit(count)   
  46.    }  
  47. }  
  48.   
  49. houston{ println it}  
  50.   
  51. //闭包例子4,用于迭代  
  52. 3.times{println 'Hi'}  
  53.   
  54. [0,1,2].each{number -> println number}  
  55.   
  56. //注意下面的it!!  
  57. [1,3,5].each{ println it}  
  58.   
  59. def println = {println it}  
  60. [4,5,6].each println  
  61.   
  62. map = ['a':1,'b':2]  
  63. map.each{key,value -> map[key]=value*2 }  
  64. assert map == ['a':2,'b':4]  
  65.   
  66. //注意下面的each后面是小括号,不是大括号了!  
  67. doubler = {key,value -> map[key] = value*2}  
  68. map.each(doubler)  
  69. assert map == ['a':4,'b':8]  
  70.   
  71. def doubleMethod(entry){  
  72.     map[entry.key] = entry.value *2;  
  73. }  
  74. doubler = this.&doubleMethod  
  75. map.each(doubler)  
  76. assert map == ['a':8,'b':16]  
  77.   
  78. //下面对集合的一些操作很容易的结合了闭包方法的使用  
  79. //查询子元素  
  80. assert [1,2,3].grep{it<3} ==[1,2]  
  81. //判断是否有一个满足条件  
  82. assert [1,2,3].any{ it%2==0 }  
  83. //判断是否全部满足条件  
  84. assert [1,2,3].every{ it <4}  
  85. //将集合中全部元素join  
  86. assert (1..9).collect{it}.join() == '123456789'  
  87. assert (1..4).collect{it*2}.join() == '2468'  
  88.   
  89. //闭包例子5:新的函数curry!以及演示一个通过闭包将list进行修改的例子!!  
  90. def add = {x,y -> x+y}  
  91. def mult = {x,y -> x*y}  
  92. assert add(1,3) == 4  
  93. assert mult(1,3) == 3  
  94.   
  95. def min = {x,y -> [x,y].min()}  
  96. def max = {x,y -> [x,y].max()}  
  97. def sub = {x,y -> return 'x - y = '+(x-y)}  
  98.   
  99. //注意下面的curry函数,意思是默认的传入参数到原有的函数的第一个位置,并将结果返回为一个新的函数  
  100. //例如下面的triple就是得到一个数值的三倍!!  
  101. def triple = mult.curry(3);assert triple(2) ==6  
  102. def atLeastTen = max.curry(10)  
  103. def subTen = sub.curry(10)  
  104. assert atLeastTen(5)==10  
  105. assert atLeastTen(15) == 15  
  106. assert subTen(13) == 'x - y = -3'  
  107.   
  108. //  
  109. def pairWise(list ,invoke){  
  110.     if(list.size()<2) return []  
  111.     def next = invoke(list[0],list[1])  
  112.     return [next]+pairWise(list[1..-1],invoke)  
  113. }  
  114.   
  115. assert pairWise(1..5,add) == [3,5,7,9]  
  116. assert pairWise(1..5,mult) == [2,6,12,20]  
  117. assert pairWise(1..5,min) == [1,2,3,4]  
  118. assert pairWise(1..5,max) == [2,3,4,5]  
  119.   
  120. //inject--参数是初始值,然后放在一个闭包里面对list的每个元素进行迭代操作!  
  121. assert 'cbaxabc' == ['a','b','c'].inject('x'){  
  122.     result,item -> item +result+item  
  123. }  
 对xml的操作

Groovy代码   收藏代码
  1. 对xml的解析  
  2.   
  3. def CAR_RECORDS = '''  
  4. <records>  
  5. <car name='HSV Maloo' make='Holden' year='2006'>  
  6. <country>Australia</country>  
  7. <record type='speed'>Production Pickup Truck with speed of 271kph</record>  
  8. </car>  
  9. <car name='P50' make='Peel' year='1962'>  
  10. <country>Isle of Man</country>  
  11. <record type='size'>Smallest Street-Legal Car at 99cm wide and 59 kg in weight</record>  
  12. </car>  
  13. <car name='Royale' make='Bugatti' year='1931'>  
  14. <country>France</country>  
  15. <record type='price'>Most Valuable Car at $15 million</record>  
  16. </car>  
  17. </records>  
  18. '''  
  19. //解析xml的第一步,进行分析--注意这里的找到的是根节点<records>,所以后面的car。size()就有值。  
  20. def records = new XmlSlurper().parseText(CAR_RECORDS)  
  21. //得到节点的数目  
  22. assert 3 == records.car.size()  
  23. //注意下面的得到car里面的country的条目,而不是直接进行records.country!!  
  24. assert 3 == records.car.country.size()  
  25. //depthFirst():计算全部的节点的数目     
  26. assert 10 == records.depthFirst().collect{it}.size()  
  27.   
  28. def firstRecord = records.car[0]  
  29. //得到一个节点里面的属性name  
  30. assert 'car' == firstRecord.name()  
  31. //得到一个节点里面的自定义属性,使用@属性名   
  32. assert 'Holden' == firstRecord.@make.toString()  
  33. //text():得到节点里面的文本信息!不是属性。  
  34. assert 'Australia' == firstRecord.country.text()  
  35.   
  36. //对节点进行判断,找到make属性含有e的条目数量  
  37. assert 2 == records.car.findAll {it.@make.toString().contains('e')}.size()  
  38. //使用正则表达式进行节点筛选  
  39. assert 2 == records.car.findAll{it.@make=~'.*e.*'}.size()  
  40.   
  41. //找到全部的国家符合正则表达式的record节点的make属性!  
  42. assert ['Holden','Peel'] == records.car.findAll{ it.country =~ '.*s.*a.*'}  
  43.     .@make.collect{it.toString()}  
  44.       
  45. //找到全部的type非空的record节点的type属性!!  
  46. assert ['speed','size','price'] == records.depthFirst().grep{it.@type!=''}.'@type'*.toString()  
  47.   
  48. def countryOne = records.car[1].country  
  49. //查找父节点的两个方法!parent和使用路径表达式  
  50. assert 'Peel' == countryOne.parent().@make.toString()  
  51. assert 'Peel' == countryOne.'..'.@make.toString()  
  52.   
  53. //将所有的节点按照指定顺序排序之后,再按顺序输出name属性!注意后面的一个×号!  
  54. def names = records.car.list().sort{ it.@year.toInteger()}.'@name'*.toString()  
  55. assert ['Royale','P50','HSV Maloo'] == names  
 操作文件,属性文件:
Groovy代码   收藏代码
  1. myFileDir = "d:\\"  
  2. myFileName = 'mytest.txt'  
  3. myFile = new File(myFileDir + myFileName)  
  4.   
  5. printFileLine = { println "File line:"+it}  
  6.   
  7. myFile.eachLine ( printFileLine )  
  8.   
  9. myFile.write('123')  
  10. myFile.append('123')  
  11.   
  12. 读取属性文件:  
  13. Properties properties = new Properties()  
  14. properties.load(new FileInputStream("d:\\conf.properties"))  
  15.   
  16. println properties.getProperty("filename")  
 正则表达式:
Groovy代码   收藏代码
  1. 正则表达式:  
  2. assert 'Hello World!' =~ /Hello/  
  3. assert 'Hello World!' ==~ /Hello\b.*/  
  4. def p = ~/Hello\b.*/  
  5. assert p.class.name == 'java.util.regex.Pattern'  
  6.   
  7. //下面的next方法是返回的下一个字符!  
  8. assert "1.23".replaceAll(/./){ch-> ch.next()}== "2/34"  
  9.   
  10. assert "1.23".replaceAll(/\d/){num -> num.toInteger()+1}=='2.34'  
  11.   
  12. //下面的 == 不可以换行!否则就是语法错误!!为什么??因为每一行后面默认就是有一个分号的!!  
  13. assert "1.23".replaceAll(/\d+/){num -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值