Scala. Как правильно конкатенировать строки?

Здравствуйте.
Писал тестовое задание на Scala (впервые видел данный ЯП), и сегодня от работодателя пришёл ответ по моему заданию.
Утверждает, что в Scala использовать + для конкатенации строк неправильно. Я в курсе, что у String есть метод concat, который делает то же самое, но в моём случае использовать + удобнее (и привычнее)
Как всё-таки правильно строки складывать, и в чём отличие + от concat ?
  • Вопрос задан
  • 1317 просмотров
Пригласить эксперта
Ответы на вопрос 3
@akileev
Java / Scala developer
Можно использовать StringBuilder, но выигрыш получите только если операций со строками будет много.
Ответ написан
mrRontgen
@mrRontgen
Scala lover.
Может быть от Вас ожидали применение функциональной парадигмы/шаблонов (какой нибудь fold(...) ) в этом месте? А Вы по императивному складывали строки...

Все способы конкатинации строк в тестовом задании приведут к одному и то же результату, но покажут разные способы мышления и подхода к решению задачи.
Ответ написан
Комментировать
@a1go1ov
Scala fan, Java developer
На самом деле действительно не хватает контекста. Возможно в задании были какие-то подробности, указывающие на правильный, с точки зрения задания, способ. Так как строки в Scala это строки из java, то к ним применяются все те же правила.
Если вы используете `+` то, например вот такое выражение не вызовет ошибки:

scala> "one" + null + 42
res0: String = onenull42


то есть при конкатенации строки с значениями других типов, эти значения за сценой переводятся к строке (вызывается метод toString())

С другой стороны concat, принимает только строки:

scala> "" concat null
java.lang.NullPointerException
  at java.lang.String.concat(String.java:2027)
  ... 33 elided

scala> "" concat 42
<console>:11: error: type mismatch;
 found   : Int(42)
 required: String
       "" concat 42
                 ^


С точки зрения производительности, строки в java (и как следствие в Scala) - imutable и оператор + при конкатенации каждый раз создает новую строку, что при конкатенации большого количества строк конечно же не очень эффективно и метод concat будет работать быстрее в такой ситуации. С другой стороны компилятор способен оптимизировать простые случаи использования оператора + и конвертировать их с использованием StringBuilder (который mutable) и он в свою очередь более производительный чем concat.

В общем и целом, если в задании был намек на необходимость конкатенации большого количества строк и чувствительность к производительности, то необходимо было использовать StringBuilder. Если же необходимо было показать более scala way, то возможно лучшим вариантом было бы использовать интерполяцию:
scala> val (one, two, three) = (1, "two", null)
one: Int = 1
two: String = two
three: Null = null

scala> s"$one $two $three"
res11: String = 1 two null
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы