You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中如何避免collect内重计算函数f(x)重复调用且不额外迭代列表?

解决方案

方法1:用for推导式绑定中间结果

这是最直观的写法,通过for推导式的中间变量绑定,让f(i)只计算一次,同时完成过滤和结果收集,全程只迭代一次列表:

def f(x: Int) = x + 2
def p(y: Int) = y > 2

val result = for {
  i <- List(4,7,1,3,9)
  res = f(i)  // 仅调用一次f(i)
  if p(res)   // 用中间结果做判断
} yield res

方法2:在collect中结合Option+flatten

在collect的代码块里先计算并保存f(i)的结果,再通过Option控制是否保留该值,最后用flatten过滤掉None:

List(4,7,1,3,9).collect {
  case i =>
    val res = f(i)
    if (p(res)) Some(res) else None
}.flatten

方法3:用flatMap合并计算与过滤

直接用flatMap把计算、判断、收集逻辑整合,同样只迭代一次列表:

List(4,7,1,3,9).flatMap { i =>
  val res = f(i)
  if (p(res)) Some(res) else None
}

内容的提问来源于stack exchange,提问作者IUnknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:37:13