Was ist das "richtige" Schreiben der standard Read-While-Schleife in Scala? Mit richtig meine ich geschrieben in einer Scala-ähnlichen Weise im Gegensatz zu einer Java-ähnlichen Art. HierWas ist der richtige Weg, um eine Read-While-Schleife in Scala zu programmieren?
ist der Code, den ich in Java haben:
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();
Hier ist der Code, den ich in Scala haben:
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
Der Scala-Code korrekt ist und funktioniert, aber fühlt sich sehr un-Scala -ich. Zum einen ist es eine wörtliche Übersetzung des Java-Codes, der keinen der Vorteile von Scala nutzt. Weiter ist es tatsächlich länger als der Java-Code! Ich habe wirklich das Gefühl, dass ich etwas verpasse, aber ich kann nicht herausfinden, was.
Ich bin ziemlich neu in Scala, und deshalb stelle ich die Frage, um nicht in die Falle zu geraten, Java-Code in Scala zu schreiben. Ich interessiere mich mehr für den Scala-Weg, um diese Art von Problem zu lösen, als in irgendeiner speziellen Hilfsmethode, die von der Scala-API bereitgestellt wird, um eine Datei zu hashen.
(ich im Voraus entschuldigen für meine Ad-hoc-Scala Adjektive in dieser Frage.)
Meine Antwort zu http://stackoverflow.com/questions/2849303 kann hilfreich sein. –
@Rex Ich würde "Iterator" anstelle von "Stream" verwenden. Schließlich ist es ein One-Shot und nicht wiederverwendbar. Außerdem hat 'Iterator' bei solchen Aufgaben eine bessere Speicherleistung. –
@Daniel - Einverstanden. Ich glaube, dass es an einem Punkt einen guten Grund gab, warum ich 'Stream' vorher benutzt habe, aber ich kann mich nicht mehr erinnern, was (und ich denke nicht, dass es trotzdem wahr bleibt). Unabhängig davon, hier 'Iterator.continually' sollte in Ordnung sein. –