在scala 2.7.5中对迭代器进行分区

oxb*_*kes 2 iterator scala lazy-evaluation scala-2.8

看起来scala 2.7.5中没有partition方法Iterator(2.8中有).我想有一个分区不失懒惰Iterator,所以下面是不是一个选项:

itr.toList.partition( someTest(_) )
Run Code Online (Sandbox Code Playgroud)

任何人都可以推荐一种方法,而无需实现我自己的partition方法吗?例如,是否有某种方法可以将其Iterator转换为延迟评估的Stream

Fla*_*gan 8

你试过这个Stream.fromIterator方法吗?它生成一个包含给定迭代器的元素的流:).

一个例子是:

val iter = List(1,2,3,4).elements // just a simple iterator

val str = Stream.fromIterator(iter)

str.partition(_ >= 3)
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助(这是你想到的).

编辑:只是一个例子来表明这是懒惰的(和记忆 - 就像所有Stream的一样).

scala> val iter = new Iterator[Int] {
     | var lst = List(1,2,3,4)
     | def hasNext() = !lst.isEmpty
     | def next() = { val x = lst.head; println(x); lst = lst.tail; x }
     | }

scala> val stream = Stream.fromIterator(iter)
1
stream: Stream[Int] = Stream(1, ?)

scala> stream.partition(_ >= 2)
2
3
4
res1: (Iterable[Int], Iterable[Int]) = (ArrayBuffer(2, 3, 4),ArrayBuffer(1))

scala> stream.partition(_ >= 3)
res2: (Iterable[Int], Iterable[Int]) = (ArrayBuffer(3, 4),ArrayBuffer(1, 2))
Run Code Online (Sandbox Code Playgroud)

注意:留下一些输出,因为它非常冗长.

- Flaviu Cipcigan