Groovy字面值StringBuilder/StringBuffer

22

Groovy支持使用文字语法来创建StringBuilder/StringBuffer,而不是通常的

def sb = new StringBuilder()

然而,我似乎无法记住(或在谷歌上找到)正确的语法。


2
sb.append("text")会将您的字符串连接起来。 - IgniteCoders
4个回答

26

要以一步获取StringBuffer,您可以使用

def sb = 'Hello'<<''

或者甚至:

def sb = ''<<'' //4 single quotes, not double quotes

对于一个最初为空的字符串,我认为(但我可能错了),使用StringBuffer而不是StringBuilder的原因是为了保持与Java 1.4的兼容性。


1
如果您需要线程安全地连接字符串,则在当前的Java版本中,您也可以使用StringBuffer - Dónal
双引号在现代 Groovy 上运行良好。 - willkil

16

3
当使用'<<='运算符时,似乎将文本从String转换为StringBuilder,对吗?另外,实际上是StringBuffer而不是StringBuilder。 - Dónal
1
事实上,我的例子可能过于简单了。你确实需要将其转换并重新分配给StringBuffer,使用<<=运算符。稍后你可以只使用<<。此外,你对于StringBuffer的理解是正确的,这也是他们允许使用[]运算符进行原地字符替换的方式。 - omerkudat

14

我刚刚在 Groovy 中使用了 StringBuilder / StringBuffer。

以下是一些示例:

// << operator example
def year = StringBuilder.newInstance()
year << 2
year << "0"
year << '1' << 4
assert year.toString() == "2014"

// You can use with operator
def month = StringBuilder.newInstance()
month.with {
    append "0"
    append '5'
}
assert month.toString() == "05"

// or just append String like in Java or you can leave parenthesis
def day = StringBuilder.newInstance()
day.append "1"
day.append('1')
assert day.toString() == '11'

// It's nice to know, that we can use StringBuilder directly in GString
def date = "$year-${month}-$day"
assert date == "2014-05-11"

注意: 当只有一个线程使用时,请使用StringBuilder。 StringBuilder提供与StringBuffer兼容的API。StringBuffer是同步的,而StringBuilder不是。请查看此链接获取更多信息。


在GString中直接使用StringBuilder没有什么特别之处:“任何Groovy表达式都是有效的”。官方文档展示了一个例子:“2和3的和等于${2 + 3}”。 - willkil

2
`String.leftShift()`方法创建一个StringBuffer
据我所知,您无法通过Groovy语法糖创建一个StringBuilder。您只能显式地创建一个StringBuilder。没有StringGString上的运算符重载会创建一个StringBuilder,您可以显式使用。Java字符串连接可能会创建一个StringBuilder,但该实例在您的代码中不可用。
在撰写本答案时:
  • 另一个答案说要使用<<=<<= 只是一个java复合赋值,使用了 <<。特别地,没有一种方法可以重载 <<=
  • 被接受的答案说要使用''<<'' //4个单引号,不是双引号。双引号在现代 Groovy 上也可以正常工作。

下面的代码表明,我们总是得到一个 StringBuffer,而不是 StringBuilder,对于各种组合的 << vs <<="" vs ''

def ls = ''<<''
println ls.class
def lse = ''
lse <<=''
println lse.class

ls = ""<<''
println ls.class
lse = ""
lse <<=''
println lse.class

ls = ''<<""
println ls.class
lse = ''
lse <<=""
println lse.class

ls = ""<<""
println ls.class
lse = ""
lse <<=""
println lse.class

打印:

class java.lang.StringBuffer
class java.lang.StringBuffer
class java.lang.StringBuffer
class java.lang.StringBuffer
class java.lang.StringBuffer
class java.lang.StringBuffer
class java.lang.StringBuffer
class java.lang.StringBuffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接