概述
[size=x-large]Groovy:Groovy中的字符串[/size]
在Groovy中我们会看到单引号(')的字符串,双引号(")的字符串,斜杠(/)的字符串, 美元符号斜杠($/)的字符串。 Groovy的字符串比Java中的复杂的多,同时功能上也强大的多。
[size=medium]单引号字符串[/size]
def s1 = 'Yep this is a string, and we can use "double quotes" without escaping them.'
def m1 = '''With three quotes
we can write multi-line strings, without all
the hassle of concatenation.'''
在单引号的字符串里,可以出现双引号,并且这时候双引号不用被转移。 连续三个单引号的字符串可以直接换行。同样,字符串里可以包含双引号。
[size=medium]双引号字符串[/size]
def s2 = "Also a string, and of course we can use 'single quotes' without escaping them."
def m2 = """
With three double quotes we can have a multi-line string,
and we don't need to add extra + signs. Very easy for
copy-paste."""
在双引号的字符串里可以出现单引号,并且这时候单引号不需要被转移。连续三个双引号的字符串可以直接包含换行。上面的例子中的双引号后面紧跟着的反斜杠的意思是这行末尾不包括换行。也就是现在字符串m2的第一个字符是W,如果不加斜杠,第一个字符是n。
[size=medium]斜杠[/size]
// Slashy (also multi-line possible):
def s3 = /Well almost everything goes in a "slashy" 'string' without escaping. Good for readable regular expressions!/
当我们的字符串里同时包含双引号和单引号时,我们可以用/.../来表示字符串。这时候里面可以直接包含单引号和双引号。斜杠的字符串里也可以直接换行
[size=medium]美元符号+斜杠[/size]
// Dollar slashy:
def s4 = $/
Like a 'slashy' string, but with different escaping rules
for slashes ("/")
/$
如果我们的字符串里既有双引号和单引号又有斜杠, 这时候可以用$/ … /$ 来定义字符串。注意这里不支持多行字符串。
[size=medium]嵌入表达式[/size]
当我们用双引号是, 我们定义的字符串的类型不是String,而是GString。这个Groovy中的特殊的字符串类型。 它支持嵌入式表达式:${expression}, 例如:
// 下面是一个简单的表达式
def user = new Expando(name: 'mrhaki', email: 'mail@email.com')
def gs1 = "Hi, your name is ${user?.name}. If I shout I will call you ${user?.name?.toUpperCase()}!"
println gs1 // 输出: Hi, your name is mrhaki. If I shout I will call you MRHAKI!
// 同样三个连续的双引号也支持表达式:
def mailMessage = """
Hi ${user?.name},
thank you for signing up.
You signed up wit the following e-mail address:
${user?.email}
Kind regards,
the support team.
"""
println mailMessage
注意,你在表达式中访问属性之前一定要保证属性是已经定义好的(值为空也没关系)。如果使用了未定义的属性会抛出groovy.lang.MissingPropertyException。
GString还支持延迟运算:在GString中使用闭包,这个闭包在调用GString的toString方法时被执行。闭包里可以有0个或1个参数。 如果指定一个参数,这个参数会被传入一个Writer对象, 你可以利用这个Writer来写入字符。如果没有参数,闭包的返回值的toString方法会被调用。
def directEval = "Current name value is ${user.name} and email is ${user.email}."
def lazyEval = "Current name value is ${ -> user.name } and email is ${ out -> out << user.email }."
user.name = 'changed username'
user.email = 'changed email'
println directEval // 输出: Current name value is mrhaki and email is mail@email.com.
println lazyEval // 输出: Current name value is changed username and email is changed email.
[size=medium]GString提供了一些方法可以访问其属性:[/size]
def user = 'mrhaki'
def language = 'Groovy'
def s = "Hello ${user}, welcome to ${language}."
// 有几个表达式?
assert 2 == s.valueCount
// 表达式的值是什么?
assert ['mrhaki', 'Groovy'] == s.values
assert 'mrhaki' == s.getValue(0)
assert 'Groovy' == s.getValue(1)
// GString的长度, 表达式执行后的长度
assert 32 == s.length()
// 表达式以外的值有哪些?
assert 'Hello ' == s.strings[0]
assert ', welcome to ' == s.strings[1]
assert '.' == s.strings[2]
// 用==(equals)表达的话,是比较的表达式代入值
assert 'Hello mrhaki, welcome to Groovy.' == s
[size=medium]多行字符串也有一些特殊操作:[/size]
def multiline = '''
Groovy is closely related to Java,
so it is quite easy to make a transition.
'''
// 多行字符串有个eachLine方法, 可以接受一个闭包
// 通过这个闭包可以对每一行进行操作
// contains the complete line.
multiline.eachLine {
if (it =~ /Groovy/) {
println it // 输出: Groovy is closely related to Java,
}
}
// eachLine的闭包有两个参数的话,第二个参数是当前行号(从0开始)
multiline.eachLine { line, count ->
if (count == 0) {
println "line $count: $line" // 输出: line 0: Groovy is closely related to Java,
}
}
// 把所有的行装换为一个List
def list = multiline.readLines()
assert list instanceof ArrayList
assert 2 == list.size()
assert 'Groovy is closely related to Java,' == list[0]
def records = """
mrhakitGroovy
huberttJava
"""
// splitEachLine方法可以让把每行输入按某个字符分割。
// 然后分割后的字符作为闭包的参数
records.splitEachLine('t') { items ->
println items[0] + " likes " + items[1]
}
// 输出:
// mrhaki likes Groovy
// hubert likes Java
// 其实上面的代码就相当于:
records.eachLine{ line ->
def items = line.split('t');
println items[0] + " likes " + items[1]
}
最后
以上就是奋斗魔镜为你收集整理的Groovy:Groovy中的字符串的全部内容,希望文章能够帮你解决Groovy:Groovy中的字符串所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复