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
相关产品推荐
相关产品推荐

