如何在映射列表时访问当前映射的元组?

How to access current mapped tuple while mapping a list?

有人可以帮我避免在下面的 Scala 映射中进行重复计算吗?

(for (i <- 0 to 20) yield i).map((i: Int) => (
  math.pow(2, i),
  math.pow(2, i).toString, // duplicate computation
  math.sqrt(i),
  math.sqrt(i).toString    // duplicate computation
))

这里不需要map,可以在for-comprehension:

里面引入新的值
for {
   i <- 0 to 20
   pow2 = math.pow(2, i)
   sqrti = math.sqrt(i)
} yield (pow2, pow2.toString, sqrti, sqrti.toString)

不是最短的答案,但对我来说似乎是最容易理解的:定义一个方法并在 .map 中使用它:

def powAndSqrt(i:Int) = {
  val pow  = math.pow(2,i)
  val sqrt = math.sqrt(i)
  (pow, pow.toString, sqrt, sqrt.toString)
}

(0 to 20).map(powAndSqrt)

只是为了补充其他很好的答案,您可以在任何块中随意声明 val,因此:

(1 to 20) map { i => 
  val pow2 = math.pow(2,i)
  val sqrti = math.sqrt(i)
  (pow2, pow2.toString, sqrti, sqrti.toString)
}

for 将完全扩展到那个并且可能更令人愉快,但了解您可以在匿名函数块中执行与在另一个块中相同的操作可能会很有用。