论坛首页 编程语言技术论坛

Groovy学习笔记三 Groovy特性

浏览 1592 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-01-05  
(1)GroovyBean
Groovy很像JavaBean,不过省略了显示声明的获取和设置方法,提供了自动构造方法,并允许你用点号(.)引用成员变量。
class Character
{
    private int strLength
    private int wisdom
}
def pc=new Character(strLength:10,wisdom:20)
pc.strLength=30
println "STRLENGTH=["+pc.strLength+"] WISDOM=["+pc.wisdom+"]"
输出为:

STRLENGTH=[30] WISDOM=[20]
 (2)安全解引用操作符
Groovy引入了安全解引用运算符,用?.符号帮你去掉一些套路化的"如果对象为null"检查代码。在使用这个符号时,Groovy引入了一个特殊的null结构,表示“什么也不做”,而不是真的引用null。
class Person
{
    private String name;
    private Integer age;
}
people=[null,new Person(name:"billLee",age:55)]
for(Person person:people)
{
   println person?.name+" age="+person?.age
}
输出:




null age=null
billLee age=55
 (3)猫王操作符
用猫王操作符(?:)可以把带有默认值的if/else结构写的及其短小。用猫王操作符不用检查null,也不用重复变量。
String agentStatus="Active"
String status=agentStatus?:"Inactive"
结果:
Result: Active
 (4)增强型字符串
Groovy有一个String类的扩展类GString,它比Java中标准的String强,也更灵活。
GString必须用双引号定义。对于开发人员来说,使用它最大的好处是可以包含可在运行时计算的表达式(用${})。如果GString随后被转换为普通字符串(比如传给了println),GString中的表达式都会被替换为其计算结果。
String name="bill lee";
def dist=3*9;
String str="${name} and dist = ${dist}"
Result: bill lee and dist = 27
 GString的底层并不是Java中的String!尤其不应该把GString作为映射中的键,或者比较它们是否相等,结果是不可预料的。
(5)函数字面值
函数字面值表示一个可以当做值传递的代码块,也可以像操作任何值一样操作。可以当做参数传递给方法,可以给变量赋值。
传统实现:
class StringUtils
{
    static String sayHello(String name)
    {
        if(name=="Tom"||name=="Jerry")
        {
            "Hello Cat and Mouse "+name+"!"
        }
        else
        {
            "Hello funs "+name+" !"
        }
    }
}
println StringUtils.sayHello("Tom")
println StringUtils.sayHello("bsr1983")
输出:
Hello Cat and Mouse Tom!
Hello funs bsr1983 !
 函数字面值实现
def sayHello=
{
    name->if(name=="Tom"||name=="Jerry")
     "Hello Cat and Mouse "+name+"!"
    else  
    "Hello funs "+name+" !"
}
println sayHello("Tom")
println sayHello("bsr1983")
输出与上面的传统实现一样
 (6)内置的集合操作
each:遍历集合,对其中每一项应用函数字面值
collect:收集在集合中每一项上应用函数字面值的返回结果(相当于其他语言map/reduce中的map函数)
inject:用函数字面值处理集合并构建返回值(相当于其他语言map/reduce的reduce函数)
findAll:找到集合中所有与函数字面值匹配的元素
max:返回集合中的最大值
min:返回集合中的最小值
示例代码:
moviesTitle=["Seven","SnowWhite","Die Hard"]
moviesTitle.each({x->println x})
输出



Seven
SnowWhite
Die Hard
moviesTitle=["Seven","SnowWhite","Die Hard"]
moviesTitle.each({println it})
 it变量可以用在单参的函数字面值中。
(7)对正则表达式的内置支持
~:创建一个模式(创建一个编译的Java Pattern对象)
=~:创建一个匹配器(创建一个Java Matcher对象)
==~:计算字符串(相当于在Pattern上调用Java match()方法)
示例代码
def pattern=/1010/
def input="1010"
def matcher=input =~ pattern
if(input==~ pattern)
{
    input=matcher.replaceFirst("0101")
    println input
}
输出

0101
("billlee 31"=~/(\w+) (\d+)/).each{full,name,age->println "$name is $age year old"}
输出

billlee is 31 year old
 (8)简单的XML处理
Groovy有构建器的概念,用Groovy原生语法可以处理任何树型结构的数据,包括HTML、XML和JSON。
1.创建XML
def writer=new StringWriter()
def xml=new groovy.xml.MarkupBuilder(writer)
xml.person(id:2)
{
    name "billlee"
    age 31
}
println writer.toString();
输出
<person id='2'>
  <name>billlee</name>
  <age>31</age>
</person>
 2.创建Json
def builder=new groovy.json.JsonBuilder()
def root=builder.people{
person
{
    name "billlee"
    age 31
}
}
println builder.toString()
println builder.toPrettyString()
def s=new StringWriter()
builder.writeTo(s)
println s.toString()
输出:
{"people":{"person":{"name":"billlee","age":31}}}
{
    "people": {
        "person": {
            "name": "billlee",
            "age": 31
        }
    }
}
{"people":{"person":{"name":"billlee","age":31}}}
 3.解析XML
Groovy有几种解析XML输入的办法。
XMLParser:支持XML文档的GPath表达式
XMLSlurper:跟XMLParser类似,但以懒加载的方式工作
DOMCategory:用一些语法支持DOM的底层解析
示例代码:
class XmlExample{ 
static def PERSON= 
""" 
<person id='2'> 
<name>billlee</name> 
<age>31</age> 
</person> 
""" 
} 
class Person{def id;def name;def age} 
def xmlPerson=new XmlParser().parseText(XmlExample.PERSON) 
Person p=new Person(id:xmlPerson.@id, 
name:xmlPerson.name.text(), 
age:xmlPerson.age.text()) 
println "id=${p.id} name=${p.name} age=${p.age}"
输出

id=2 name=billlee age=31
注:"""是Groovy中用来定义跨行字符串的。
 
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics