2012-05-08 36 views
4

我需要將一些Java代碼轉換爲Scala。我有這樣的來源。如何在Scala中重寫它?問題可能很簡單。但是它在文檔中的匹配比較困難(我的< - 1直到10){}例子。重寫'for'循環從Java到Scala

for (int i = password.length(); i != 0; i >>>=1) 
    { some code } 

國王的問候, 阿列克謝

回答

6

如果你希望它是儘可能快的 - 我是這樣假設是考慮到換檔操作的情況下 - 那麼你應該使用while循環:

var i = password.length() 
while (i != 0) { 
    // some code 
    i >>>= 1 
} 

這是爲數不多的案例之一Java在給定相同操作的情況下比Scala更緊湊。

您還可以使用尾遞歸:

final def passwordStuff(password: Password)(i: Int = password.length): Whatever = { 
    if (i != 0) { 
    // Some code 
    passwordStuff(password)(i >>> 1) 
    } 
} 

這將編譯成相同的速度while循環的東西(在幾乎所有情況下,無論如何)。

0

不知道>>> =運算符。讓我們嘗試多一點功能,的foreach需要一個函數A =>設備,在這種情況下,A是詮釋

def breakdownBy2(from:Int):List[Int] = if(from == 0) Nil else List(from) ++ breakdownBy2(from/2) 
breakdownBy2(passoword.length).foreach(println(_)) 
2

如果你尋找異國情調的功能性的方式,你可以寫這樣的事情:

Stream.iterate(password.length)(i => i >>> 1).takeWhile(0!=) 

它懶洋洋地執行以下操作:需要密碼長度爲初始值,適用{ => i >>> 1 }它,把它傳遞給下一個迭代,適用...通行證,...

然後我範圍的計算,它限制只會丟失不等於0的值。