Мутирование измененной коллекции с использованием карты?

Если у вас есть изменяемая структура данных, такая как Array, можно ли использовать операции map или что-то подобное для изменения ее значений?

Скажем, у меня val a = Array(5, 1, 3), что лучший способ сказать, вычитая 1 из каждого значения? Лучшее, что я придумал, это

for(i <- 0 until a.size) { a(i) = a(i) - 1 }

Я полагаю, что путь должен был сделать массив a var, а не val, поэтому я могу сказать

a = a map (_-1)

edit: довольно легко свернуть мой собственный, если ничего не встроено, хотя я не знаю, как обобщать другие изменчивые коллекции

scala> implicit def ArrayToMutator[T](a: Array[T]) = new {
     |   def mutate(f: T => T) = a.indices.foreach {i => a(i) = f(a(i))}
     | }
ArrayToMutator: [T](a: Array[T])java.lang.Object{def mutate(f: (T) => T): Unit}

scala> val a = Array(5, 1, 3)
a: Array[Int] = Array(5, 1, 3)

scala> a mutate (_-1)

scala> a
res16: Array[Int] = Array(4, 0, 2)

Ответы

Ответ 1

Если вам не нужны индексы, вам нужен метод transform.

scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)

scala> a.transform(_+1)
res1: scala.collection.mutable.WrappedArray[Int] = WrappedArray(2, 3, 4)

scala> a
res2: Array[Int] = Array(2, 3, 4)

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

Ответ 2

Как насчет использования foreach, так как вы действительно не хотите возвращать измененную коллекцию, вы хотите выполнить задачу для каждого элемента. Например:

a.indices.foreach{i => a(i) = a(i) - 1}

или

a.zipWithIndex.foreach{case (x,i) => a(i) = x - 1}