En Scala hay una clase Stream que se parece mucho a un iterador. El tema Difference between Iterator and Stream in Scala? ofrece algunas ideas sobre las similitudes y diferencias entre los dos.Casos de uso para flujos en Scala
Ver cómo usar una secuencia es bastante simple pero no tengo muchos casos de uso comunes en los que utilizaría una secuencia en lugar de otros artefactos.
Las ideas que tengo en este momento:
- Si tienen que hacer uso de una serie infinita. Pero esto no me parece un caso de uso común, así que no se ajusta a mis criterios. (Por favor corrígeme si es común y solo tengo un punto ciego)
- Si tiene una serie de datos donde cada elemento necesita ser computado pero que puede reutilizarlo varias veces. Esto es débil porque podría cargarlo en una lista que es conceptualmente más fácil de seguir para un gran subconjunto de la población de desarrolladores.
- Quizás haya un gran conjunto de datos o una serie computacionalmente costosa y existe una gran probabilidad de que los elementos que necesita no requieran visitar todos los elementos. Pero en este caso un iterador sería una buena coincidencia a menos que necesite hacer varias búsquedas, en ese caso podría usar una lista incluso si fuera un poco menos eficiente.
- Hay una serie compleja de datos que deben reutilizarse. De nuevo, una lista podría usarse aquí. Aunque en este caso ambos casos serían igualmente difíciles de usar y un Stream sería una mejor opción ya que no es necesario cargar todos los elementos. Pero de nuevo no es tan común ... ¿o no?
Entonces, ¿he olvidado algún gran uso? ¿O es una preferencia del desarrollador en su mayor parte?
Gracias
Otra diferencia que me gustaría añadir es que 'Stream' nunca es floja en su elemento principal. La cabeza de un 'Stream' se almacena en forma evaluada. Si se necesita una secuencia donde ningún elemento (incluido el encabezado) se compute hasta que se solicite, 'Iterator' es la única opción. – Lii
Además de la falta de holgazanería en el elemento principal, también evalúa cada elemento que desee eliminar. ej .: '" a "# ::" b "# ::" c "# ::" d "# :: Stream.empy [String] .drop (3)' evaluará "a", "b", " c "y" d ". "d" porque se convierte en cabeza. – r90t
Interesante ejemplo sucinto para el generador de números primos.Curiosamente, si creo eso en una consola Scala simple y luego pregunto 4000 primos (no tanto en la práctica, tengo una definición alternativa que crea 100K en menos de 2 segundos) falla Scala con un error "Límite superior de GC rebasado" . –