¿Cuál es el "correcto" de escribir el ciclo estándar de lectura/lectura en Scala? Por apropiado me refiero a escrito en una forma similar a Scala en comparación con una forma de Java.¿Cuál es la forma correcta de codificar un ciclo de lectura en Scala?
Aquí está el código que tengo en Java:
MessageDigest md = MessageDigest.getInstance("MD5");
InputStream input = new FileInputStream("file");
byte[] buffer = new byte[1024];
int readLen;
while((readLen = input.read(buffer)) != -1)
md.update(buffer, 0, readLen);
return md.digest();
Aquí está el código que tengo en Scala:
val md = MessageDigest.getInstance(hashInfo.algorithm)
val input = new FileInputStream("file")
val buffer = new Array[ Byte ](1024)
var readLen = 0
while(readLen != -1)
{
readLen = input.read(buffer)
if(readLen != -1)
md.update(buffer, 0, readLen)
}
md.digest
El código Scala es correcto y funciona, pero se siente muy poco Scala -ish. Para uno, es una traducción literal del código de Java, sin aprovechar ninguna de las ventajas de Scala. ¡Además es más largo que el código de Java! Realmente siento que me estoy perdiendo algo, pero no puedo entender qué.
Soy bastante nuevo en Scala, por lo que estoy haciendo la pregunta para evitar caer en la trampa de escribir código de estilo Java en Scala. Estoy más interesado en la forma de Scala para resolver este tipo de problema que en cualquier otro método de ayuda específico que pueda proporcionar la API de Scala para el hash de un archivo.
(Me disculpo de antemano por mis hoc adjetivos ad Scala en toda esta cuestión.)
Mi respuesta a http://stackoverflow.com/questions/2849303 puede ser útil. –
@Rex Yo usaría 'Iterator' en lugar de' Stream'. Después de todo, es de un solo disparo y no reutilizable. Además, 'Iterator' tiene mejor rendimiento de memoria en tales tareas. –
@Daniel - De acuerdo. Creo que hubo una buena razón por la que utilicé 'Stream' anteriormente, pero ya no puedo recordar qué (y no creo que siga siendo así). De todos modos, aquí 'Iterator.continually' debería estar bien. –