Разбиение итератора в scala 2.7.5 - PullRequest
2 голосов
/ 02 октября 2009

Похоже, что нет метода partition для Iterator в scala 2.7.5 (есть в 2.8). Я хотел бы иметь раздел без потери laziness из Iterator, поэтому следующая опция не :

itr.toList.partition( someTest(_) )

Кто-нибудь может порекомендовать способ сделать это без реализации моего собственного partition метода? Например, есть ли какой-нибудь способ преобразования Iterator в лениво оцененный Stream?

1 Ответ

8 голосов
/ 02 октября 2009

Вы пробовали метод Stream.fromIterator? Создает поток, содержащий элементы данного итератора:).

Примером может быть:

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

val str = Stream.fromIterator(iter)

str.partition(_ >= 3)

Надеюсь, это поможет (и это то, что вы имели в виду).

РЕДАКТИРОВАТЬ: Просто пример, чтобы показать, что это ленивый (и запомнил - как все 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))

NB: пропущен какой-то вывод, поскольку он был довольно многословным.

- Флавиу Чипчиган

...