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

3

请问有人能帮我避免以下这个 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
))

2
小注:(for (i <- 0 to 20) yield i) 是写 (0 to 20) 的一种复杂方式。 - Didier Dupont
3个回答

3

在这里你不需要使用map,你可以在for循环中引入新的值:

for {
   i <- 0 to 20
   pow2 = math.pow(2, i)
   sqrti = math.sqrt(i)
} yield (pow2, pow2.toString, sqrti, sqrti.toString)

谢谢,这太棒了! - user4727396

1

虽然不是最短的答案,但对我来说最容易理解的方法是:定义一个方法并在.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)

谢谢您提供这个!但是,我更喜欢保持yield的方式。 - user4727396

0

仅为补充其他答案,它们都很好,您可以在任何块中随意声明vals:

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

for将被扩展为完全相同的内容,这可能更加令人愉悦,但是知道在匿名函数块中可以执行相同的操作也可能会有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接