Gli stream sono come elenchi che generano i membri in base alle esigenze. Una volta che un elemento è stato generato, viene mantenuto nello stream e riutilizzato.
Ad esempio:
lazy val naturals: Stream[Int] = Stream.cons(0, naturals.map{_ + 1})
vi darà un flusso di numeri naturali. Se chiamo
naturals(5)
genererà elementi 0-5 e ritorno 5, se poi chiamo
naturals(8)
Sarà riutilizzare i primi 6 elementi e generare più 3.
Se siete preoccupati per l'utilizzo della memoria, è possibile utilizzare Stream.drop(num)
per produrre un nuovo flusso con num
elementi rimossi dal principio, permettendo gli elementi troncati di essere garbage collection con il vecchio flusso. Ad esempio:
naturals(5) //returns 5
val truncated = naturals.drop(4)
truncated(5) //returns 9
fonte
2011-12-19 20:00:41
Non si dovrebbe pensare a 'Stream's come' Iterator's, ma piuttosto come 'List's la cui valutazione può essere ritardata. [Questa domanda e le sue risposte] (http://stackoverflow.com/questions/1527962/difference-between-iterator-and-stream-in-scala) possono aiutare. – Philippe