Объединение списка строк с использованием 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