Я думаю, что это работает очень хорошо, когда речь идет о рекурсии. В противном случае я предпочитаю Iterator, поскольку в Stream есть определенные подводные камни, большое количество данных и сохраняющиеся ссылки на начало потока.

ел бы создатьIterator он получает свой следующий элемент путем (многократной) оценки выражения, и я хочу, чтобы выражение могло возвращать определенное значение для его завершения.

Единственное, что я нашел, этоIterator.continually (), который кажется бесконечным. Важно, чтобы выражение не оценивалось доnext() называется наIterator.

Есть ли способ получить такое поведение?

например:

def getNext = {
  // some complicated code
  val next = ... // either a STOP value or a real value to be returned by the iterator
} 

val myIter = Iterator.continually(getNext) // want this to stop at some point
 Heinrich Schmetterling29 мая 2011 г., 06:45
он не должен возвращать больше предметов.
 sourcedelica29 мая 2011 г., 03:18
что должен возвращать итератор, когда видит стоп-значение?

Ответы на вопрос(2)

scala.collection.immutable.Stream? Его цель - создать последовательность, подобную объекту, где лениво оценивается следующий элемент. Это может быть конечным или бесконечным.

Например:

Welcome to Scala version 2.9.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_24).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import collection.immutable._
import collection.immutable._

scala> def next(i: Int): Stream[Int] = Stream.cons(i*i, next(i*i))
next: (i: Int)scala.collection.immutable.Stream[Int]

scala> val stream = next(2)
stream: scala.collection.immutable.Stream[Int] = Stream(4, ?)

scala> stream.find(_ > 1000)
res0: Option[Int] = Some(65536)
 huynhjl29 мая 2011 г., 03:18
Я думаю, что это работает очень хорошо, когда речь идет о рекурсии. В противном случае я предпочитаю Iterator, поскольку в Stream есть определенные подводные камни, большое количество данных и сохраняющиеся ссылки на начало потока.

Iterator.continually обычно сочетается сtakeWhile:

def complexCompute(): Int = { count +=1; println("eval " + count); count }

val iter = Iterator.continually { complexCompute() }
iter.takeWhile(_ < 3).foreach(println)

Какие отпечатки:

eval 1
1
eval 2
2
eval 3

Таким образом, если условие, которое определяет, должно ли вычисление продолжаться, может быть оценено за пределами вычисления, то это работает довольно хорошо.

В основном я думаю, что я говорюIterator.continually(getNext()).takeWhile(_ != certainValue) достигнет того, что вы пытаетесь сделать. Это лениво оценивается.

Ваш ответ на вопрос