假设我正在这样编写函数foo: Seq[B] => Boolean
:
case class B(xs: Seq[Int])
def foo(bs: Seq[B]): Boolean = bs.map(_.xs.size).sum > 0
上述实现是次优的(例如,不必遍历所有bs
元素以返回true
)。
您将如何有效地实施foo
??
答案 0 :(得分:4)
好吧,对于0
来说,这是微不足道的:
bs.exists(!_.xs.isEmpty)
可以完成这项工作,因为一旦找到非空的xs
,您就完成了。
现在,假设阈值并非微不足道,例如, 42,而不是0。
然后,您可以使用bs
的迭代器,使用scanLeft
逐步汇总值,然后检查exists
是否存在大于零的中间结果:
def foo(bs: Seq[Int]): Boolean = bs
.iterator
.scanLeft(0)(_ + _.xs.size)
.exists(_ > 42)