【问题标题】:How to access current mapped tuple while mapping a list?映射列表时如何访问当前映射的元组?
【发布时间】:2015-06-02 18:43:53
【问题描述】:

有人可以帮我避免在下面的 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
))

【问题讨论】:

  • 小注:(for (i &lt;- 0 to 20) yield i) 是一种复杂的写法(0 to 20)

标签: list scala dictionary tuples


【解决方案1】:

这里不需要map,可以在for-comprehension 中引入新值:

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

【讨论】:

  • 谢谢,太好了!
【解决方案2】:

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

【讨论】:

  • 谢谢你!但是,我更愿意保持让步。
【解决方案3】:

只是为了补充其他答案,这很好,您可以在任何块内随意声明 vals,所以:

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

for 将被扩展为完全一样,并且可能更令人愉快,但知道您可以在匿名函数块中和在另一个块中执行相同操作可能会很有用。

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 2019-08-10
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多