Это запах преждевременной микрооптимизации.
Хотя существуют веские причины для использования изменчивости (включая оптимизацию), вы не указали, почему вы считаете, что ваше использование является допустимым, или большую проблему, которую вы пытаетесь решить. В частности, неизменные списки эффективны очень при взятии хвоста и добавлении нового заголовка - 100% элементов, не являющихся заголовками, будут разделены между исходным и новым списком.
Как показано, самое чистое решение для ваших требований - забыть о ListBuffer
, придерживаться неизменного List
и реализовать someMethod
без использования побочных эффектов.
def someMethod(xs: List[Int]) = xs match {
case h :: t => (h+1) :: t
case Nil => Nil
}
val ct = List(5)
println (someMethod(ct).headOption getOrElse "empty list")
// should print 6
С другой стороны, если является точкой доступа к производительности, и вы не можете определить какой-либо способ повышения производительности путем изменения алгоритма, тогда вам нужно будет использовать Array
Массив - это единственный тип сбора данных в JVM. Таким образом, вы можете напрямую работать с примитивами в массиве и избежать упаковки / распаковки, с которой приходится сталкиваться другим типам коллекций.
Преимущество здесь не имеет ничего общего с изменчивостью и неизменностью; стоимость производительности распаковки / упаковки намного выше, чем стоимость производительности (если таковая имеется) при использовании неизменяемого Списка.