Nel framework di collezioni Scala 2.8, qual è la differenza tra view
e toStream
?Qual è la differenza tra una vista e uno stream?
risposta
In una vista gli elementi vengono ricalcolati ogni volta che si accede. In un flusso gli elementi vengono mantenuti mentre vengono valutati.
Ad esempio:
val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))
sarà rivalutare la mappa per ogni elemento due volte. Una volta per il primo println, e ancora per il secondo. Al contrario,
val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))
raddoppierà solo una volta gli elementi.
Una vista è come una ricetta per creare una collezione. Quando chiedi elementi di una vista, esegue la ricetta ogni volta.
Un flusso è come un ragazzo con un mucchio di carte cancellabili a secco. Il ragazzo sa come calcolare gli elementi successivi della collezione. Puoi chiedergli il prossimo elemento della collezione e ti darà una carta con l'elemento scritto sopra e una stringa legata dalla carta al dito (per aiutarlo a ricordare). Inoltre, prima che ti dia una carta, scioglie la prima corda dal suo dito e la lega alla nuova carta.
Se tieni la prima carta (cioè tieni un riferimento alla testa del flusso) potresti finire le carte (cioè la memoria) quando chiedi il prossimo elemento, ma se non hai bisogno di torna ai primi elementi puoi tagliare la corda e consegnare le carte non necessarie al ragazzo e lui può riutilizzarle (sono cancellate a secco dopotutto). Ecco come un flusso può rappresentare una sequenza infinita senza esaurire la memoria.
Geoff s' answer copre quasi tutto, ma voglio aggiungere che un Stream
è una sequenza List
-come, mentre ogni tipo di collezioni (mappe, insiemi, seguenti del regolamento provvisorio indicizzati) hanno vista.
Ho un dubbio. poiché la funzione è pura. Perché il compilatore non usa la trasparenza referenziale o la memoizzazione? Perché la visualizzazione la sta ricalcolando di nuovo? –
@huynhj avete capito bene. Posso aggiornare la risposta per rendere più chiaro –
puoi lasciare la risposta così com'è. A volte una metafora aiuta. In questo caso mi sono confuso. La prima frase ha avuto tutto. – huynhjl
L'esempio di stringa è molto confuso. – ziggystar