Pergunta

Parece que não existe um método partition em um Iterator em Scala 2.7.5 (existe em 2.8). Eu gostaria de ter uma partição sem perder o preguiça do Iterator, então o seguinte é não uma opção:

itr.toList.partition( someTest(_) )

Alguém pode recomendar uma maneira de fazer isso sem implementar o meu próprio método partition? Por exemplo, há alguma maneira de converter um Iterator em um Stream preguiçosamente-avaliado?

Foi útil?

Solução

Você já tentou o método Stream.fromIterator ? Ela produz uma corrente contendo os elementos da dada iteração:.)

Um exemplo seria:

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

val str = Stream.fromIterator(iter)

str.partition(_ >= 3)

Espero que ajude (e é a coisa que você tinha em mente).

EDIT:. Apenas um exemplo para mostrar que este é preguiçoso (e memoised - como todos os Streams são)

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:. Deixado alguma saída para fora como foi muito detalhado

- Flaviu Cipcigan

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top