Что "надлежащей" из записи является стандартный цикл с условием продолжения чтения в Scala? Надлежащим я имею в виду записанный подобным Scala способом в противоположность подобному Java пути.
Вот код, который я имею в 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();
Вот код, который я имею в 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
Код Scala является правильным и работы, но чувствует очень un-Scala-ish. Для одного это - буквальный перевод кода Java, не используя в своих интересах ни одно из преимуществ Scala. Далее это на самом деле длиннее, чем код Java! Я действительно чувствую, что пропускаю что-то, но я не могу выяснить что.
Я довольно плохо знаком с Scala, и таким образом, я задаю вопрос, чтобы не попадать в ловушку написания кода стиля Java в Scala. Я больше интересуюсь Scala способ решить этот вид проблемы, чем в любом определенном вспомогательном методе, который мог бы быть обеспечен API Scala для хеширования файла.
(Я приношу извинения заранее за свои специальные прилагательные Scala всюду по этому вопросу.)
Основываясь на сообщении Рекса, которое он упомянул:
Stream.continually(input.read(buffer)).takeWhile(_ != -1).foreach(md.update(buffer, 0, _))
Вы должны заменить на него строки var readLen + while {...}, это даст тот же результат.
Как упоминал Рекс, он работает со scala 2.8.
В своем комментарии Рекс Керр предлагает следующее:
val md = MessageDigest.getInstance("MD5")
val input = new FileInputStream("foo.txt")
val buffer = new Array[ Byte ]( 1024 )
Stream.continually(input.read(buffer))
.takeWhile(_ != -1)
.foreach(md.update(buffer, 0, _))
md.digest
Ключом является Stream.continually
. Он получает выражение, которое оценивается непрерывно, создавая бесконечный поток
оцениваемого выражения. takeWhile
- это перевод из while
-условия. foreach
является телом while
-цикла.