Un consejo general: utilice el método .iterator
generosamente, para evitar la creación de colecciones intermedias, y así acelerar su cálculo. (Sólo cuando los requisitos de rendimiento exigen. O de lo contrario no lo hacen.)
scala> def myFun(s: String, i: Int) = s + i
myFun: (s: String, i: Int)java.lang.String
scala> Array("nami", "zoro", "usopp")
res17: Array[java.lang.String] = Array(nami, zoro, usopp)
scala> res17.iterator.zipWithIndex
res19: java.lang.Object with Iterator[(java.lang.String, Int)]{def idx: Int; def idx_=(x$1: Int): Unit} = non-empty iterator
scala> res19 map { case (k, v) => myFun(k, v) }
res22: Iterator[java.lang.String] = non-empty iterator
scala> res22.toArray
res23: Array[java.lang.String] = Array(nami0, zoro1, usopp2)
Tenga en cuenta que los iteradores son mutables, y por lo tanto una vez que se consume no puede ser utilizado de nuevo.
Un aparte: La llamada map
anterior implica de-tupling y luego aplicación de función. Esto fuerza el uso de algunas variables locales. Puede evitar eso usando alguna hechicería de orden superior: convierta una función regular a la que está aceptando una tupla, y luego páselo a map
.
scala> Array("nami", "zoro", "usopp").zipWithIndex.map(Function.tupled(myFun))
res24: Array[java.lang.String] = Array(nami0, zoro1, usopp2)
Me encanta leer sus respuestas en materia de velocidad, pero puede ser tan deprimente a veces ... :-) Gracias –
. Una buena selección. – Ivan
¿Cómo se compara la velocidad de 'a.view.zipWithIndex.map {case (s, i) => myFn (s, i)}' con sus soluciones? – gzm0