Quel est le "bon" d'écrire la boucle de lecture standard dans Scala? Par vrai, je veux dire écrit d'une manière semblable à Scala, par opposition à une manière similaire à Java.Quelle est la bonne façon de coder une boucle read-while dans Scala?
Voici le code que j'ai 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();
Voici le code que j'ai à 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
Le code Scala est correct et fonctionne, mais se sent très non Scala -ish. Pour l'un, c'est une traduction littérale du code Java, ne tirant parti d'aucun des avantages de Scala. En outre, il est en fait plus long que le code Java! J'ai vraiment l'impression qu'il me manque quelque chose, mais je n'arrive pas à comprendre quoi. Je suis assez nouveau à Scala, et donc je pose la question pour éviter de tomber dans le piège de l'écriture de code Java dans Scala. Je suis plus intéressé par la méthode Scala pour résoudre ce genre de problème que dans n'importe quelle méthode d'assistance spécifique qui pourrait être fournie par l'API Scala pour hacher un fichier.
(je présente mes excuses à l'avance pour mes ad hoc adjectifs Scala dans toute cette question.)
Ma réponse à http://stackoverflow.com/questions/2849303 peut être utile. –
@Rex J'utiliserais 'Iterator' au lieu de' Stream'. Après tout, c'est un one-shot et non réutilisable. En outre, 'Iterator' a de meilleures performances de mémoire dans de telles tâches. –
@Daniel - D'accord. Je crois qu'il y avait une bonne raison à un moment donné d'utiliser Stream avant, mais je ne me souviens plus de quoi (et je ne pense pas que cela reste vrai de toute façon). Peu importe, ici 'Iterator.continually' devrait être bien. –