2010-02-17 3 views

Répondre

41

Dans une vue, les éléments sont recalculés chaque fois qu'ils sont accédés. Dans un flux, les éléments sont conservés au fur et à mesure qu'ils sont évalués.

Par exemple:

val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2) 
println(doubled.mkString(" ")) 
println(doubled.mkString(" ")) 

réévaluera la carte pour chaque élément deux fois. Une fois pour la première impression, et encore pour la seconde. En revanche

val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2) 
println(doubled.mkString(" ")) 
println(doubled.mkString(" ")) 

doublera seulement les éléments une fois. Une vue est comme une recette pour créer une collection. Lorsque vous demandez des éléments d'une vue, elle exécute la recette à chaque fois. Un flux est comme un gars avec un tas de cartes effaçables à sec. Le gars sait comment calculer les éléments suivants de la collection. Vous pouvez lui demander l'élément suivant de la collection et vous donner une carte avec l'élément écrit dessus et une ficelle attachée de la carte à son doigt (pour l'aider à se souvenir). Aussi, avant qu'il ne vous donne une carte, il détache la première corde de son doigt et l'attache à la nouvelle carte.

Si vous gardez la première carte (c.-à-d. Gardez une référence à la tête du flux), vous risquez de manquer de cartes (mémoire) lorsque vous demandez l'élément suivant, mais si vous n'avez pas besoin de revenir aux premiers éléments, vous pouvez couper la chaîne et remettre les cartes inutiles au gars et il peut les réutiliser (ils sont effaçables à sec après tout). C'est ainsi qu'un flux peut représenter une séquence infinie sans manquer de mémoire.

+0

@huynhj vous avez raison. Je peux mettre à jour la réponse pour le rendre plus clair –

+1

vous pouvez laisser la réponse telle quelle. Parfois, une métaphore aide. Dans ce cas, je suis confus. La toute première phrase avait tout. – huynhjl

+1

L'exemple de chaîne est très déroutant. – ziggystar

10

Geoff « s answer couvre presque tout, mais je veux ajouter qu'un Stream est une séquence List -comme, alors que toutes sortes de collections (cartes, jeux, seqs indexés) ont des vues.

+0

J'ai un doute. puisque la fonction est pure. Pourquoi le compilateur n'utilise pas de transparence référentielle ou de mémo? Pourquoi la vue la recompute-t-elle encore? –

Questions connexes