有人可以帮我避免下面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
))
答案 0 :(得分:3)
这里你不需要map
,你可以在for-comprehension中引入新的值:
for {
i <- 0 to 20
pow2 = math.pow(2, i)
sqrti = math.sqrt(i)
} yield (pow2, pow2.toString, sqrti, sqrti.toString)
答案 1 :(得分: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)
答案 2 :(得分: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
将扩展到那个并且可能更令人愉快,但知道你可以在匿名功能块中执行与在另一个块中相同的操作可能是有用的。