Groovy литерал StringBuilder/StringBuffer

Groovy поддерживает буквенный синтаксис для создания StringBuilder/StringBuffer вместо обычного

def sb = new StringBuilder()

Однако я не могу вспомнить (или найти в Google) правильный синтаксис.


person Dónal    schedule 25.11.2009    source источник
comment
sb.append("text") объединит ваши строки   -  person IgniteCoders    schedule 19.01.2016


Ответы (4)


Чтобы получить StringBuffer за один шаг, вы можете использовать

def sb = 'Hello'<<''

или даже:

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

для изначально пустого.

Я думаю (хотя могу ошибаться), что причина использования StringBuffer, а не StringBuilder, заключается в обеспечении совместимости с Java 1.4.

person matt    schedule 25.11.2009
comment
Вы также должны использовать StringBuffer в текущих версиях Java, если вам нужно объединить строки потокобезопасно. - person Dónal; 20.01.2016
comment
Двойные кавычки работают нормально, по крайней мере, на современном groovy. - person willkil; 11.03.2019

Чтобы создать StringBuffer:

text = 'Hello '

Чтобы добавить:

text <<= 'World!'

И это может помочь еще немного.

person omerkudat    schedule 25.11.2009
comment
Кажется, что этот текст преобразуется из String в StringBuilder только при использовании оператора '‹‹=', верно? Кроме того, на самом деле это StringBuffer, а не StringBuilder. - person Dónal; 25.11.2009
comment
Да, на самом деле мой пример может быть слишком упрощенным. Вам нужно преобразовать и переназначить StringBuffer, как таковой, оператор <<=. Позже вы можете просто использовать <<. Также вы правы насчет StringBuffer, именно так они разрешили замену символов на месте с помощью оператора []. - person omerkudat; 25.11.2009

Я только что играл с StringBuilder/StringBuffer в Groovy.

Некоторые примеры ниже:

// << 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 предоставляет API, совместимый со StringBuffer. StringBuffer синхронизируется, StringBuilder — нет. Проверьте эту ссылку для получения дополнительной информации.

person Michal Z m u d a    schedule 11.05.2014
comment
Нет ничего особенного в использовании StringBuilder непосредственно в GString: допустимо любое выражение Groovy. официальная документация показывает "The sum of 2 and 3 equals ${2 + 3}" в качестве примера. - person willkil; 11.03.2019

String.leftShift() создает StringBuffer.

AFAICS, вы не можете создать StringBuilder с помощью синтаксического сахара groovy. Вы можете создать StringBuilder только явно. Нет перегрузки оператора для String или GString создает StringBuilder, который вы можете явно использовать. Объединение строк Java может создать StringBuilder, но этот экземпляр нельзя будет использовать в вашем коде.

На момент написания этого ответа:

  • Другой ответ сказал использовать <<=. <<= — это просто составной код Java задание, в котором используется <<. В частности, не существует способа перегрузки <<=.
  • В принятом ответе сказано использовать ''<<'' //4 single quotes, not double quotes. Двойные кавычки работают нормально, по крайней мере, на современном groovy.

Следующий код показывает, что мы всегда получаем 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
person willkil    schedule 11.03.2019