2011-03-19 18 views
7

¿La gente realmente usa la clase Stream de Scala en código de producción, o es principalmente de interés académico?Secuencia en el código de producción

+1

¿Qué tiene de especial 'Stream' que te hace esta pregunta? ¿Por qué no debería uno usarlo en el código de producción? – Madoc

+1

Es fácil agotar la memoria para uno. También parece recordar haber leído que su implementación muestra su edad. Entonces, tengo curiosidad de saber si la gente realmente lo usa para cosas que van más allá del Proyecto Euler. ;) –

Respuesta

4

No hay ningún problema con Stream, excepto cuando las personas lo utilizan para reemplazar Iterator - en contraposición a la sustitución de List, que es la colección más similar a ella. En ese caso particular, uno debe ser cuidadoso en su uso. Por otro lado, también se debe tener cuidado al usar Iterator, ya que cada elemento solo se puede repetir una vez.

Así que, como ambos tienen sus propios problemas, ¿por qué elegir Stream? Me atrevería a decir que es simplemente que las personas están acostumbradas a Iterator de Java, mientras que Stream es algo funcional.

+0

Bueno, Stream parece tener sus problemas, como cuando se usa en reducedLeft. –

+0

Muchas buenas respuestas a esta pregunta; este fue para mí el más útil, ya que no entendía que usarlo como una Lista, no como un Iterador, es el enfoque correcto. Gracias a todos los que respondieron. –

2

Sí, lo uso, aunque tiende a ser algo como esto:

(as.toStream collect expensiveConversionToB) match { 
    case b #:: _ => //found my expensive b 
    case _  => 
} 

Por supuesto, puede ser que utilice una visión no estricta y una find para este ejemplo

+0

Supongo que lo que me motiva es la constatación de que Stream es tan frágil en términos de uso de la memoria, que me daría escalofríos encontrarlo en el código de producción, a menos que no haya otra forma. –

1

Desde el La única razón para no usar Stream s es que puede ser complicado asegurar que la JVM no esté manteniendo referencias a las primeras consideraciones, un enfoque que he usado es bastante bueno construir un Stream y convertirlo inmediatamente a un Iterator para Uso actual. Pierde un poco de las buenas propiedades de Stream en el lado del uso, especialmente con respecto al retroceso, pero si solo va a hacer una pasada sobre el resultado, con frecuencia es más fácil construir una estructura que contorsionar en el hasNext/next() modelo de Iterator directamente.

3

Aunque escribí que Iterator is what I want to use nearly all the time utilizo Stream en el código de producción. Simplemente no asumo automáticamente que las células son basura recolectada.

A veces Stream se adapta perfectamente al problema. Creo que la API da some good examples cuando se trate de recursividad ...

+0

Gracias por el enlace a la otra pregunta, muy útil. –

3

Mire here. Esta publicación de blog describe cómo usar Scala Streams (junto con el archivo mapeado de memoria) para leer archivos grandes (1-2G) de manera eficiente.

No lo intenté todavía pero la solución parece razonable. Stream proporciona una buena abstracción sobre el bajo nivel de ByteBuffer Java API para manejar un archivo mapeado en memoria como una secuencia de registros.

Cuestiones relacionadas