Объединение списка строк с использованием mkString vs foldRight

В настоящее время я тестирую вещи в Scala, пытаясь привыкнуть к функциональному программированию, а также снова накладывать новый язык (это было с тех пор, как в последний раз).

Теперь, учитывая список строк, если я хочу объединить их в одну длинную строку (например, "scala", "is", "fun" => "scalaisfun"), я решил, что один из способов сделать это - сделать foldRight и применить конкатенацию к соответствующим элементам. Другим способом, по общему признанию, гораздо проще, назвать mkString.

Я проверил github, но не смог найти исходный код для соответствующих функций (любая помощь по этому поводу была бы оценена), поэтому я не знаю, как реализованы функции. С вершины моей головы я думаю, что mkString более гибкий, но он чувствует, что в реализации может быть foldRight. Есть ли в этом правда?

В противном случае скальдадоки отмечают, что mkString вызывает toString для каждого соответствующего элемента. Видя, что они уже начинаются с строк, это может быть одной отрицательной точкой для mkString в данном конкретном случае. Любые комментарии о плюсах и минусах обоих методов в отношении производительности, простоты/элегантности и т.д.?

Ответ 1

Простой ответ: используйте mkString.

someString.toString возвращает тот же объект.

mkString реализуется с одним StringBuilder и создает только одну новую строку. С помощью foldLeft вы создадите новые строки N-1.

Вы можете использовать StringBuilder в foldLeft, это будет так же быстро, как mkString, но mkString короче:

strings.foldLeft(new StringBuilder){ (sb, s) => sb append s }.toString
strings.mkString // same result, at least the same speed

Ответ 2

Не используйте foldRight, если это вам действительно не понадобится, поскольку оно переполнит ваш стек для больших коллекций (для некоторых типов коллекций). foldLeft или fold будет работать (не сохраняет промежуточные данные в стеке), но будет медленнее и более неудобно, чем mkString. Если список непусто, также будут работать reduce и reduceLeft.

Ответ 3

Память Im используется, mkString использует StringBuilder для создания эффективной строки. Вы можете сделать то же самое, используя Scala StringBuilder в качестве аккумулятора до foldRight, но зачем беспокоиться, если mkString уже может сделать для вас все эти хорошие вещи. Плюс mkString дает вам дополнительное преимущество, включая дополнительный разделитель. Вы можете сделать это в foldRight, но это уже сделано для вас с mkString