groovy笔记:XML,JSON,集合操作,正则,闭包

看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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值