一般提示:大量使用.iterator 方法,以避免创建中间集合,从而加快计算速度。 (仅当性能要求需要时。否则不需要。)
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)
请记住,迭代器是可变的,因此一旦使用就不能再次使用。
顺便说一句:上面的map 调用涉及去元组,然后是函数应用程序。这会强制使用一些局部变量。您可以使用一些高阶魔法来避免这种情况 - 将常规函数转换为接受元组的函数,然后将其传递给 map。
scala> Array("nami", "zoro", "usopp").zipWithIndex.map(Function.tupled(myFun))
res24: Array[java.lang.String] = Array(nami0, zoro1, usopp2)