21

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

def sb = new StringBuilder()

但是,我似乎不记得(或在 Google 上找到)正确的语法。

4

4 回答 4

26

要在一个步骤中获取 StringBuffer,您可以使用

def sb = 'Hello'<<''

甚至:

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

对于一个最初是空的。

我认为(但我可能错了)使用 StringBuffer 而不是 StringBuilder 的原因是为了保持与 Java 1.4 的兼容性。

于 2009-11-25T16:14:01.737 回答
16

创建一个字符串缓冲区:

text = 'Hello '

追加:

text <<= 'World!'

这可能会有所帮助。

于 2009-11-25T15:04:43.547 回答
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 不是。检查此链接以获取更多信息。

于 2014-05-11T15:09:59.583 回答
1

String.leftShift() 创建一个 StringBuffer

AFAICS,您不能通过常规语法糖创建字符串生成器。您只能显式创建 StringBuilder。StringGS​​tring上没有运算符重载会创建可以显式​​使用的 StringBuilder。Java 字符串连接可能会创建一个 StringBuilder,但该实例无法在您的代码中使用。

在撰写此答案时:

  • 另一个答案说使用<<=. <<=只是一个使用<<. 特别是,没有重载 <<=的方法。
  • 接受的答案说使用''<<'' //4 single quotes, not double quotes. 双引号工作正常,至少在现代 groovy 上。

<<以下代码显示,对于vs<<=""vs的各种组合的结果,我们总是得到一个 StringBuffer,而不是 StringBuilder ''

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
于 2019-03-11T17:19:34.293 回答