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

Scala中如何通过一次操作提取匹配对象,避免开销方法重复调用?

避免Scala中昂贵函数重复调用的简洁方案

针对你代码里expensive()和expensive2()被重复调用的问题,不用写冗长的unapply对象,以下几种简洁方案可以解决:

方案1:在if守卫中缓存计算结果

利用Scala的作用域特性,在case分支的if守卫里定义临时变量存储昂贵函数的计算结果,后续直接复用该变量,同时保留collectFirst的短路特性(找到第一个匹配分支就停止执行):

foo collectFirst {
  case x if { val res = expensive(x); check(res) } => do_something(res)
  case x if { val res2 = expensive2(x); check2(res2) } => do_something_else(res2)
}

方案2:改写为返回Option的全函数

把原偏函数改成返回Option的全函数,collectFirst会自动提取第一个非None的结果,逻辑更直观:

foo collectFirst {
  case x =>
    val res = expensive(x)
    if (check(res)) Some(do_something(res))
    else {
      val res2 = expensive2(x)
      if (check2(res2)) Some(do_something_else(res2))
      else None
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:41:01