2009-10-06 18 views

Respuesta

42

Stream memoises y Iterator no. Puede atravesar el mismo Stream varias veces y obtener el mismo resultado cada vez. Iterador, por otro lado, solo puede atravesarse una vez.

+1

Con respecto a la memorización, si accedo al elemento Nth, ¿es el tiempo de acceso O (1) u O (N)? – ryeguy

+7

@ryeguy Es O (n) porque Stream crea una lista vinculada a los valores del elemento de caché. –

+1

OK, entonces, ¿cuál es la diferencia entre Stream e Iterable? –

18

Ambos son construcciones para acceder a un elemento actual, con una lista aún desconocida de los elementos restantes (la cola perezosa).

Iterator es una construcción imperativa que solo puede atravesar una vez.

Stream es una construcción funcional. En teoría, puede atravesarlo varias veces (y como otros mencionaron, no volverá a calcular las partes ya calculadas), pero en la práctica porque los flujos son infinitos o muy grandes (es por eso que lo usa en primer lugar), sosteniendo la referencia al flujo completo no tiene mucho sentido (se encuentra con Out Of Memory bastante fácil).

Generalmente es más seguro que la mente evitar llano Stream s. Las alternativas están usando EphemeralStream de Scalaz que auto-olvida partes no reconocidas usando referencias débiles, o usando Iteratees (vea también here) o something similiar.

+0

Tengo curiosidad: ¿por qué EphemeralStream no es una implementación predeterminada? Siempre puedes reconstruir partes olvidadas del linaje de datos (es un lenguaje funcional). Esto suena como un gran defecto de diseño. – tribbloid

Cuestiones relacionadas