我需要將一些Java代碼轉換爲Scala。我有這樣的來源。如何在Scala中重寫它?問題可能很簡單。但是它在文檔中的匹配比較困難(我的< - 1直到10){}例子。重寫'for'循環從Java到Scala
for (int i = password.length(); i != 0; i >>>=1)
{ some code }
國王的問候, 阿列克謝
我需要將一些Java代碼轉換爲Scala。我有這樣的來源。如何在Scala中重寫它?問題可能很簡單。但是它在文檔中的匹配比較困難(我的< - 1直到10){}例子。重寫'for'循環從Java到Scala
for (int i = password.length(); i != 0; i >>>=1)
{ some code }
國王的問候, 阿列克謝
如果你希望它是儘可能快的 - 我是這樣假設是考慮到換檔操作的情況下 - 那麼你應該使用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循環的東西(在幾乎所有情況下,無論如何)。
i >>>=
1等同於i /= 2
爲正整數。
將此知識與Incrementing the for loop (loop variable) in scala by power of 5的答案結合起來,您應該進行設置。
不知道>>> =運算符。讓我們嘗試多一點功能,的foreach需要一個函數A =>設備,在這種情況下,A是詮釋
def breakdownBy2(from:Int):List[Int] = if(from == 0) Nil else List(from) ++ breakdownBy2(from/2)
breakdownBy2(passoword.length).foreach(println(_))
如果你尋找異國情調的功能性的方式,你可以寫這樣的事情:
Stream.iterate(password.length)(i => i >>> 1).takeWhile(0!=)
它懶洋洋地執行以下操作:需要密碼長度爲初始值,適用{ => i >>> 1 }
它,把它傳遞給下一個迭代,適用...通行證,...
然後我範圍的計算,它限制只會丟失不等於0的值。
非常感謝您的鏈接。我將它添加到我的書籤。很有用。 – Ezhik