如何有效地编写此功能?

时间:2018-08-18 10:54:19

标签: scala collections

假设我正在这样编写函数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??

1 个答案:

答案 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)