Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Groovy literal StringBuilder/StringBuffer

Groovy supports a literal syntax for creating a StringBuilder/StringBuffer instead of the usual

def sb = new StringBuilder()

However, I can't seem to remember (or find on Google) the correct syntax.

like image 832
Dónal Avatar asked Nov 25 '09 14:11

Dónal


People also ask

Which is better StringBuilder or StringBuffer?

StringBuffer is thread-safe and synchronized whereas StringBuilder is not. That's why StringBuilder is faster than StringBuffer. String concatenation operator (+) internally uses StringBuffer or StringBuilder class.

How do I concatenate two strings in groovy script?

Groovy Programming Fundamentals for Java Developers The concatenation of strings can be done by the simple '+' operator. Parameters − The parameters will be 2 strings as the left and right operand for the + operator.

How much faster is StringBuilder than StringBuffer?

Speed: StringBuffer is actually two to three times slower than StringBuilder . The reason behind this is StringBuffer synchronization - only allowing 1 thread to execute on an object at a time results in much slower code execution.

What is StringBuffer and StringBuilder in C#?

StringBuilder is same as the StringBuffer , that is it stores the object in heap and it can also be modified . The main difference between the StringBuffer and StringBuilder is that StringBuilder is also not thread safe. StringBuilder is fast as it is not thread safe .


4 Answers

To get a StringBuffer in a single step, you could use

def sb = 'Hello'<<'' 

or even:

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

for an initially empty one.

I think (but I could be wrong) the reason for using a StringBuffer rather than a StringBuilder is to maintain compatibility with Java 1.4.

like image 110
matt Avatar answered Sep 17 '22 17:09

matt


To create a StringBuffer:

text = 'Hello ' 

To append:

text <<= 'World!' 

And this might help some more.

like image 33
omerkudat Avatar answered Sep 16 '22 17:09

omerkudat


I've just played with StringBuilder / StringBuffer in Groovy.

Some examples below:

// << 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"

Note: Use StringBuilder when it is used only by one thread. StringBuilder provides an API compatible with StringBuffer. StringBuffer is synchronized, StringBuilder is not. Check this link for more info.

like image 26
Michal Z m u d a Avatar answered Sep 20 '22 17:09

Michal Z m u d a


String.leftShift() creates a StringBuffer.

AFAICS, you cannot create a StringBuilder via groovy syntax sugar. You can only create a StringBuilder explicitly. No operator overload on String or GString creates a StringBuilder that you can explicitly use. Java String concatenation might create a StringBuilder, but that instance wouldn't be usable in your code.

At the time of writing this answer:

  • Another answer said to use <<=. <<= is merely a java compound assignment that uses <<. In particular, there is no method for overloading <<=.
  • The accepted answer said to use ''<<'' //4 single quotes, not double quotes. Double quotes work fine, at least on modern groovy.

The following code shows that we always get a StringBuffer, not a StringBuilder, for the result of various combinations of << vs <<= and "" 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

prints:

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
like image 26
willkil Avatar answered Sep 17 '22 17:09

willkil