Scala довольно близка к Java для работы со строками.Ваш пример:
val stringval = "bar"
"abc" + stringval + "abc"
фактически заканчивается (в стиле java) как:
(new StringBuilder()).append("abc").append(stringval()).append("abc").toString()
Это то же поведение, что и java, + между строками обычно переводятся в экземпляры StringBuilder,которые более эффективны.Итак, здесь вы делаете три копии для StringBuilder и одно окончательное создание String и, в зависимости от длины строк, возможно три перераспределения.
В вашем примере:
def surround(s:String, ss:String):String = {
val surrounded = new StringBuilder(s.length() + 2*ss.length(), s)
surrounded.insert(0,ss)
surrounded.append(ss)
surrounded.mkString
}
Вы делаете то же самое количество копий (3), но вы выделяете только один раз.
Совет: Если строки маленькие, используйте +, это очень мало меняет.Если строки относительно большие, инициализируйте StringBuilder соответствующей длины, но затем просто добавьте.Это гораздо понятнее для других разработчиков.
Как всегда, с производительностью, измерьте ее, и, если различия невелики, используйте более простое решение