【Groovy手札】Groovy的字符串

来源:互联网 发布:网络延长器接法 编辑:程序博客网 时间:2024/04/29 04:39

Groovy提供不同的字符串表现形式,包括:

def map= [:]

map.'单引号'
map
."双引号"
map
.'''三重单引号'''
map
."""三重双引号"""
map
./单斜杠字符串/
map
.$/美元单斜杠字符串/$

 

Groovy同样支持Java的字符串类型(java.lang.String),而且也有自己的可插值字符串(groovy.lang.GString)。

 

2.1 单引号字符串

单引号字符串是指由包含在单引号之间的字符序列:

'a singlequoted string'

单引号字符串会被Groovy编译器解释为java.lang.String,并且不支持内插。

 

2.2 字符串拼接

所有的Groovy字符串都可以由操作符 + 进行拼接:

assert 'ab'== 'a'+ 'b'

 

2.3 三重单引号字符串

三重单引号字符串是指由包含在连续的三个单引号之间的字符序列:

'''a triplesingle quoted string'''

三重单引号字符串同样会被Groovy编译器解释为java.lang.String,并且不支持插值。但是三重单引号字符串支持多行(multiline)输入,

def aMultilineString='''lineone
line two
line three'''

2.4 特殊字符

Groovy中的特殊字符包括:

'\t'

tabulation(制表符)

'\b'

backspace(退格键)

'\n'

newline(新行)

'\r'

carriage return(回车键)

'\f'

formfeed(换页符)

'\\'

反斜杠

'\''

单引号

'\"'

双引号

 

2.5 双引号字符串

双引号字符串是指由包含在双引号之间的字符序列:

"adouble quoted string"

在没有内插的表达式时,编译器会将其转换成java.lang.String,如果存在需要转换的表达式,则会将其转换成groovy.lang.GString实例。

 

2.6字符串插值

除了单引号和三重单引号字符串以外,所有剩下的GroovyString表达式都可以进行插值操作。需要插值的地方使用一个占位符代替,可以使用${} 或者对于.表达式使用$ 前缀。GroovyGString会通过调用 toString() 方法来转换得到字符串对象。

def name='Guillaume'// a plain string
def greeting="Hello${name}"

assert greeting.toString()=='Hello Guillaume'

而且,任何的Groovy表达式都是有效的:

def sum="The sum of 2 and3 equals ${2 + 3}"
assert sum.toString()=='The sum of 2 and 3 equals 5'

其实不仅仅只有表达式,代码句也是可以放在占位符 ${}中的,只不过这个代码句的转换值是null而已。

def person=[name:'Guillaume', age:36]
assert"$person.name is $person.age years old"=='Guillaume is 36 yearsold'

但是仅仅对于 a.b, a.b.c,这种.表达式是有效的,对于.表达式后面不是属性,而是方法的情况则会报出groovy.lang.MissingPropertyException 异常,例如:

def number=3.14

shouldFail(MissingPropertyException){
    println
"$number.toString()"
}

Groovy会认为你在尝试获取number对象的一个名为 toString的属性,所以可以认为"$number.toString()" 会被解释成"${number.toString}()".

 

2.7  GString和String的hashCodes

JavaString对象是不可变对象,但是GString对象是可变的,其表现值取决于插值。虽然groovy.lang.GStringjava.lang.String可能会得到相同的结果,但是他们的hashCode是不一样的。

assert"one: ${1}".hashCode()!="one: 1".hashCode()

由于GStringString的哈希码不同,所以千万不要使用Gstring对象作为一个MapKey

def key="a"
def m=["${key}":"letter${key}"]    

assert m["a"]==null   

0 0
原创粉丝点击