In Scala esiste una classe Stream che è molto simile a un iteratore. L'argomento Difference between Iterator and Stream in Scala? offre alcune informazioni sulle somiglianze e le differenze tra i due.Casi d'uso per gli stream in Scala
Vedere come utilizzare un flusso è abbastanza semplice ma non ho molti comuni casi di utilizzo in cui vorrei utilizzare uno stream anziché altri artefatti.
Le idee che ho in questo momento:
- Se avete bisogno di fare uso di una serie infinita. Ma questo non mi sembra un caso d'uso comune, quindi non corrisponde ai miei criteri. (Si prega di correggermi se è comune e ho solo un punto cieco)
- Se si dispone di una serie di dati in cui ogni elemento deve essere calcolato ma che si potrebbe desiderare di riutilizzare più volte. Questo è debole perché potrei semplicemente caricarlo in una lista che è concettualmente più facile da seguire per un grosso sottogruppo della popolazione di sviluppatori.
- Forse c'è una grande serie di dati o una serie computazionalmente costosa e c'è un'alta probabilità che gli elementi necessari non richiederanno la visita di tutti gli elementi. Ma in questo caso un Iterator sarebbe una buona corrispondenza a meno che non sia necessario fare diverse ricerche, in tal caso si potrebbe usare anche un elenco anche se sarebbe leggermente meno efficiente.
- Esiste una serie complessa di dati che è necessario riutilizzare. Di nuovo una lista potrebbe essere usata qui. Anche se in questo caso entrambi i casi sarebbero ugualmente difficili da usare e uno Stream sarebbe una misura migliore dal momento che non tutti gli elementi devono essere caricati. Ma ancora non è così comune ... o è vero?
Quindi ho perso qualche grande utilizzo? O è una preferenza per gli sviluppatori per la maggior parte?
Grazie
Un'altra differenza che vorrei aggiungere è che 'Stream' non è mai pigro nel suo elemento principale. La testa di un 'Stream' è memorizzata in forma valutata. Se uno ha bisogno di una sequenza in cui nessun elemento (compresa la testa) viene calcolato fino a quando richiesto, 'Iterator' è l'unica scelta. – Lii
Oltre alla non-pigrizia dell'elemento head, valuta anche ogni elemento che vuoi eliminare. es .: '" a "# ::" b "# ::" c "# ::" d "# :: Stream.empy [String] .drop (3)' valuterà "a", "b", " c "e" d ". "d" perché diventa testa. – r90t
Esempio succinto interessante per il generatore di numeri primi.È interessante notare che se lo creo in una semplice console di Scala e poi chiedo 4000 numeri primi (non tanto nella pratica, ho una definizione alternativa che crea 100K in meno di 2 secondi) si blocca Scala con un errore "Limite di sovraccarico GC superato" . –