看groovy的时候找资料的时候归纳的
代码测试过都可以执行:
groovy笔记:
XML操作: MarkupBuilder:
def s=new StringWriter() def builder = new groovy.xml.MarkupBuilder(s) builder.'web-app' { 'display-name' 'My Web Application' } println s.toString()
在里面也可以嵌套写 或者写for等表达式
创建:
groovy.xml.StreamingMarkupBuilder
(http://groovy.codehaus.org/Creating+XML+using+Groovy%27s+StreamingMarkupBuilder)
groovy.xml.MarkupBuilder
解析可以使用XMLParser:
class XmlExample { static def PERSON = """ <person id='2'> <name>Gweneth</name> <age>1</age> </person> """ } //?XML作为Groovy源码 class Person {def id; def name; def age} //Groovy中的Person定义 def xmlPerson = new XmlParser(). parseText(XmlExample.PERSON) //?读取XML Person p = new Person(id: xmlPerson.@id, name: xmlPerson.name.text(), age: xmlPerson.age.text()) //?填入GroovyBean Person中 println "${p.id}, ${p.name}, ${p.age}"
生成Json:
和XML的MarkupBuilder传入SW不同 他的输出靠builder本身就可以了
def builder = new groovy.json.JsonBuilder() def root = builder.people { person { firstName 'Guillame' lastName 'Laforge' // Named arguments are valid values for objects too address( city: 'Paris', country: 'France', zip: 12345, ) married true // a list of values conferences 'JavaOne', 'Gr8conf' } } println builder.toString() println builder.toPrettyString() def s=new StringWriter() builder.writeTo(s) println s.toString()
或者直接传入一个结构:
import groovy.json.JsonBuilder def tasks = [1, 2, 3] def data = [ //data是map success: true, count: tasks.size(), data: tasks.collect {[id: it]} ] def json = new JsonBuilder(data) println json.toPrettyString()
解析直接使用:JsonSlurper
import groovy.json.JsonBuilder import groovy.json.JsonSlurper def builder = new groovy.json.JsonBuilder() def root = builder.people { person { firstName 'Guillame' lastName 'Laforge' // Named arguments are valid values for objects too address( city: 'Paris', country: 'France', zip: 12345, ) married true // a list of values conferences 'JavaOne', 'Gr8conf' } } def result = new JsonSlurper().parseText(builder.toString()) println result.people.person.firstName
集合操作:
集合支持 +(两个集合) -(两个集合) * 的操作
each:遍历集合,对其中的每一项应用函数字面值 //相当于erlang的 lists:foreach操作
collect:收集在集合中每一项上应用函数字面值的返回结果(相当于其他语言map/reduce中的map函数)//相当于erlang的lists:map操作
inject:用函数字面值处理集合并构建返回值(相当于其他语言里map/reduce中的reduce函数)
//相当于erlang中lists:foldl操作
findAll:找到集合中所有与函数字面值匹配的元素 //相当于erlang lists:filter操作
max:返回集合中的最大值
min:返回集合中的最小值
erlang中:
1> A=[1,2,3,4,5,6]. [1,2,3,4,5,6] 2> lists:map(fun(E) -> E*2 end,A). [2,4,6,8,10,12] 3> lists:foldl(fun(E,Sum) -> Sum+E end,0,A). 21 5> lists:filter(fun(E) -> E rem 2==0 end,A). [2,4,6] 6> lists:foreach(fun(E) -> io:format("~p~n",[E*2]) end,A). 1 2 3 4 5 6 ok
对应的groovy中:
a=[1,2,3,4,5,6] println a.collect {i -> i*2} println a.inject(0, {sum, value -> sum + value }) println a.findAll {i -> i%2==0} a.each {i -> println(i*2)}
正则表达式
用 def pattern = ~ "正则表达式" //注意 = ~是分开的!!!
然后要match用 def match=("验证的字符串" =~ pattern)就可以了
练习案例:
def begin=System.currentTimeMillis() def stream=new URL("http://fc.5sing.com/10933160.html###").openStream(); def out=new ByteArrayOutputStream(); def data=new byte[1024]; while((length=stream.read(data))!=-1){ out.write(data,0,length) } data=out.toString("utf-8") def p = ~"songID: SongID, songType: \"fc\", file: \"(.*)\", singerID: UserID" def matcher=(data =~ p) for(m in matcher){ result=m.get(1) } def end=System.currentTimeMillis() println "time elasped:${end-begin}ms" result
此外:
字符串可以直接 进行-操作
"1231"-"1" //等于"231" 这点erlang也是一样的 用--符号
关于闭包:
//转换 interface One{ def drink(); } def one={ -> println "hello"} as One one.drink() //默认是Callable类型的 def closure = { "called" } assert closure instanceof java.util.concurrent.Callable assert closure() == "called" //将当前的方法变成一个函数 def modify(item){ "modify_${item}" } def fun=this.&modify def list=[1,2,3,4,5] list.collect(fun) fun(45) //对于静态方法 def s=Math.&sqrt s(4) //对于实例方法: class Mine{ public String sayHello(){ return "hello"; } } def m=new Mine() def hello=m.&sayHello hello()