簡體   English   中英

在Scala中編寫read-while循環的正確方法是什么?

[英]What is the proper way to code a read-while loop in Scala?

在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-ish。 首先,它是Java代碼的字面翻譯,充分利用了Scala的優勢。 而且它實際上比Java代碼長! 我真的覺得我錯過了什么,但我無法弄清楚是什么。

我對Scala很新,所以我要問的問題是避免陷入在Scala中編寫Java風格代碼的陷阱。 我對Scala解決此類問題的方式比對Scala API提供的任何特定幫助方法更感興趣,以便對文件進行哈希處理。

(我在此問題中提前為我的臨時Scala形容詞道歉。)

根據雷克斯的帖子,他提到:

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

你應該用它替換var readLen + {...}行,它會產生相同的結果。

正如Rex所說,它適用於scala 2.8。

Rex Kerr在評論中建議如下:

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 它得到一個連續計算的表達式,創建一個評估表達式的無限Stream takeWhile是從翻譯while -condition。 foreachwhile -loop的主體。

咖喱功能怎么樣? 你有11行Scala代碼:

val md = MessageDigest.getInstance(hashInfo.algorithm)
val input = new FileInputStream("file")
iterateStream(input){ (data, length) => 
    md.update(data, 0, length)
}
md.digest

第3行的iterateStream函數可以添加到庫中:

def iterateStream(input: InputStream)(f: (Array[Byte], Int) => Unit){
    val buffer = new Array[Byte](512)
    var curr = input.read(buffer)
    while(curr != -1){
        f(buffer, curr)
        curr = input.read(buffer)
    }
}

丑陋的重復代碼(讀取輸入的地方)最終出現在庫中,經過充分測試並遠離程序員。 我覺得第一個代碼塊比Iterator.continually解決方案簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM