我有一个takeWhile
的用例,但我想在谓词为真之后保留固定数量的项目。我也试图把它写成尽可能通用的集合类型。如下所示:
def takeWhileWithOffset[A, Iter[_] <: Iterable[A]](iter: Iter[A], p: A => Boolean, offset: Int)
我选择Iterable
作为界限,因为希望它与Stream
一起使用。但是我很难搞清楚如何完成这项工作。如果我使用严格的集合,如果偏移不是正的,我可以使用dropRight
。但Iterable
没有dropRight
。
积极的情况比较棘手。我可以使用sliding
有效地抓取未来的项目,然后在init
终止后使用lastOption
和takeWhile
。但Iterable
没有init
和lastOption
。
所以有点棘手的是我希望我的方法是懒惰的,但是利用迭代项可以被视为严格集合的事实 - 但只有 takeWhile
终止。有没有办法做到这一点?
答案 0 :(得分:4)
take
和scala> 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}}