请问有人能帮我避免以下这个 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
))
请问有人能帮我避免以下这个 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循环中引入新的值:
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)
仅为补充其他答案,它们都很好,您可以在任何块中随意声明vals:
(1 to 20) map { i =>
val pow2 = math.pow(2,i)
val sqrti = math.sqrt(i)
(pow2, pow2.toString, sqrti, sqrti.toString)
}
for
将被扩展为完全相同的内容,这可能更加令人愉悦,但是知道在匿名函数块中可以执行相同的操作也可能会有用。
(for (i <- 0 to 20) yield i)
是写(0 to 20)
的一种复杂方式。 - Didier Dupont