我需要将一些 Java 代码转换为 Scala。我有这样的来源。如何在 Scala 中重写它?问题可能很简单。但它比文档中的 for(i <- 1 until 10) {} 示例更难匹配。
for (int i = password.length(); i != 0; i >>>=1)
{ some code }
国王问候,阿列克谢
如果你希望它尽可能快——我假设这是给定 shift 操作的情况——那么你应该使用一个 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 循环相同的速度(无论如何,几乎在所有情况下)。
如果您寻求异国情调的功能方式,您可以编写如下内容:
Stream.iterate(password.length)(i => i >>> 1).takeWhile(0!=)
它懒惰地执行以下操作:将密码长度作为初始值,应用于{ => i >>> 1 }
它,将其传递给下一次迭代,应用......通过,......
然后我对计算进行了限定,将其限制为仅那些不等于 0 的值。
i >>>=
1 等价i /= 2
于正整数。
将这些知识与Incrementing the for loop (loop variable) in scala by 5的答案相结合,您应该进行设置。
不知道 >>>= 运算符。让我们尝试更实用一点,foreach 接受一个函数 A => Unit,在这种情况下 A 是 Int
def breakdownBy2(from:Int):List[Int] = if(from == 0) Nil else List(from) ++ breakdownBy2(from/2)
breakdownBy2(passoword.length).foreach(println(_))