【发布时间】:2011-03-01 23:10:48
【问题描述】:
在 Scala 中编写标准 read-while 循环的“正确性”是什么?确切地说,我的意思是用类似 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 代码是正确且有效的,但感觉非常不符合 Scala 风格。一方面,它是对 Java 代码的直译,没有利用 Scala 的任何优点。此外,它实际上比 Java 代码长!我真的觉得我错过了什么,但我不知道是什么。
我对 Scala 还很陌生,所以我提出这个问题是为了避免陷入在 Scala 中编写 Java 样式代码的陷阱。我对 Scala 解决此类问题的方法更感兴趣,而不是 Scala API 可能提供的用于散列文件的任何特定辅助方法。
(我提前为我在整个问题中使用的 Scala 形容词道歉。)
【问题讨论】:
-
我对@987654321@ 的回答可能会有所帮助。
-
@Rex 我会使用
Iterator而不是Stream。毕竟,它是一次性的,不可重复使用。此外,Iterator在此类任务中具有更好的内存性能。 -
@Daniel - 同意。我相信我之前使用
Stream有一个很好的理由,但我不再记得是什么(而且我认为它仍然不是真的)。无论如何,这里Iterator.continually应该没问题。
标签: scala inputstream io