在Scala中使用偏移量编写通用takeWhile

时间:2017-08-30 01:30:05

标签: scala collections stream scala-collections lazy-sequences

我有一个takeWhile的用例,但我想在谓词为真之后保留固定数量的项目。我也试图把它写成尽可能通用的集合类型。如下所示:

def takeWhileWithOffset[A, Iter[_] <: Iterable[A]](iter: Iter[A], p: A => Boolean, offset: Int)

我选择Iterable作为界限,因为希望它与Stream一起使用。但是我很难搞清楚如何完成这项工作。如果我使用严格的集合,如果偏移不是正的,我可以使用dropRight。但Iterable没有dropRight

积极的情况比较棘手。我可以使用sliding有效地抓取未来的项目,然后在init终止后使用lastOptiontakeWhile。但Iterable没有initlastOption

所以有点棘手的是我希望我的方法是懒惰的,但是利用迭代项可以被视为严格集合的事实 - 但只有 takeWhile终止。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

takescala> val it = (1 to 100).iterator it: Iterator[Int] = non-empty iterator scala> val (a, b) = it.span(_ < 10) a: Iterator[Int] = non-empty iterator b: Iterator[Int] = unknown-if-empty iterator scala> val res = a ++ b.take(5) res: Iterator[Int] = non-empty iterator scala> res.toList res0: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

{{1}}