web-dev-qa-db-ja.com

GroovyリテラルStringBuilder / StringBuffer

Groovyは、通常の代わりにStringBuilder/StringBufferを作成するためのリテラル構文をサポートしています

def sb = new StringBuilder()

しかし、正しい構文を覚えていない(またはGoogleで見つけていない)ようです。

19
Dónal

単一のステップでStringBufferを取得するには、次を使用できます。

def sb = 'Hello'<<''

あるいは:

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

最初は空でした。

StringBuilderではなくStringBufferを使用する理由は、Java 1.4との互換性を維持するためです)と思います(ただし、間違っている可能性があります)。

22
matt

StringBufferを作成するには:

text = 'Hello '

追加するには:

text <<= 'World!'

そしてこれはもう少し役立つかもしれません。

15
omerkudat

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"

注:1つのスレッドでのみ使用される場合は、StringBuilderを使用します。 StringBuilderは、StringBufferと互換性のあるAPIを提供します。 StringBufferは同期されますが、StringBuilderは同期されません。詳細については、これを確認してください リンク

11

String.leftShift()StringBufferを作成します

AFAICS、Groovyシンタックスシュガーを介してStringBuilderを作成することはできません。 StringBuilderは明示的にのみ作成できます。 String または GString で演算子のオーバーロードがない場合、明示的に使用できるStringBuilderが作成されます。 Java文字列の連結 StringBuilderを作成する可能性があります が、そのインスタンスはコードで使用できません。

この回答を書いている時点で:

  • 別の答えは<<=を使用すると言われています。 <<=は、<<を使用する Java複合代入 にすぎません。特に、 オーバーロード<<=のメソッドはありません。
  • 受け入れられた答えは''<<'' //4 single quotes, not double quotesを使用すると言われました。少なくとも現代のグルーヴィーでは、二重引用符は問題なく機能します。

次のコードは、<< vs <<=および"" vs ''のさまざまな組み合わせの結果に対して、StringBuilderではなくStringBufferを常に取得することを示しています。

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
0
willkil