【Groovy手札】Groovy的字符串
2016-01-22 20:26
148 查看
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中的特殊字符包括:
2.5
双引号字符串
双引号字符串是指由包含在双引号之间的字符序列:
"adouble quoted string"
在没有内插的表达式时,编译器会将其转换成
java.lang.String,
如果存在需要转换的表达式,则会将其转换成
groovy.lang.GString实例。
2.6
字符串插值
除了单引号和三重单引号字符串以外,所有剩下的GroovyString表达式都可以进行插值操作。需要插值的地方使用一个占位符代替,可以使用${} 或者对于.表达式使用$ 前缀。Groovy的GString会通过调用 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
Java中String对象是不可变对象,但是GString对象是可变的,其表现值取决于插值。虽然groovy.lang.GString和java.lang.String可能会得到相同的结果,但是他们的hashCode是不一样的。
assert
"one: ${1}".hashCode()
!=
"one: 1".hashCode()
由于GString和String的哈希码不同,所以千万不要使用Gstring对象作为一个Map的Key。
def key
="a"
def m
=["${key}":
"letter${key}"]
assert m["a"]
==
null
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(换页符) |
'\\' | 反斜杠 |
'\'' | 单引号 |
'\"' | 双引号 |
双引号字符串
双引号字符串是指由包含在双引号之间的字符序列:
"adouble quoted string"
在没有内插的表达式时,编译器会将其转换成
java.lang.String,
如果存在需要转换的表达式,则会将其转换成
groovy.lang.GString实例。
2.6
字符串插值
除了单引号和三重单引号字符串以外,所有剩下的GroovyString表达式都可以进行插值操作。需要插值的地方使用一个占位符代替,可以使用${} 或者对于.表达式使用$ 前缀。Groovy的GString会通过调用 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
Java中String对象是不可变对象,但是GString对象是可变的,其表现值取决于插值。虽然groovy.lang.GString和java.lang.String可能会得到相同的结果,但是他们的hashCode是不一样的。
assert
"one: ${1}".hashCode()
!=
"one: 1".hashCode()
由于GString和String的哈希码不同,所以千万不要使用Gstring对象作为一个Map的Key。
def key
="a"
def m
=["${key}":
"letter${key}"]
assert m["a"]
==
null
相关文章推荐
- 新工作 Day16 周五
- 『青云志』QingCloud Spark 服务新增 1.6.0 版本
- IOS给图片添加文字水印
- Linux 中索引节点的理解
- 2016/1/22 1, 1-100 放集合 特定对象移除 2,List集合和Set集合是否可以重复添加
- abstract class和interface有什么区别?
- C++中的指针
- C++ operator关键字(重载操作符)
- Python中urllib2总结
- poj2253 - Frogger(最短路变形)
- NSPredicate和搜索栏的使用
- Axure 7由中继器完成添加删除操作
- POJ1661 Help Jimmy
- 【转】C++动态创建二维数组,二维数组指针
- 使用 Xinetd 端口代理
- BLE Android开发中的问题
- 图片缩放特效
- UI基础整理-16
- Jetty环境下Geoserver跨域
- Qt 5.4.2(自带mingw32)配置Qwt6.1.2