2009-10-02 6 views
2

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

itr.toList.partition(someTest(_)) 

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

ответ

8

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

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

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

val str = Stream.fromIterator(iter) 

str.partition(_ >= 3) 

Надеется, что это помогает (и это вещь вы имели в виде).

EDIT: Просто пример, чтобы показать, что это лениво (и замечено - как все Stream s).

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: Остался выход, поскольку он был довольно многословным.

- Flaviu Cipcigan

 Смежные вопросы

  • Нет связанных вопросов^_^