Что надлежащий путь состоит в том, чтобы кодировать цикл с условием продолжения чтения в Scala?

Что "надлежащей" из записи является стандартный цикл с условием продолжения чтения в 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 всюду по этому вопросу.)

26
задан ARKBAN 10 June 2010 в 01:40
поделиться

2 ответа

Основываясь на сообщении Рекса, которое он упомянул:

Stream.continually(input.read(buffer)).takeWhile(_ != -1).foreach(md.update(buffer, 0, _))

Вы должны заменить на него строки var readLen + while {...}, это даст тот же результат.

Как упоминал Рекс, он работает со scala 2.8.

28
ответ дан 28 November 2019 в 07:35
поделиться

В своем комментарии Рекс Керр предлагает следующее:

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-цикла.

8
ответ дан 28 November 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: