Reputation: 874
I need to convert some Java code to Scala. I have such source. How to rewrite it in Scala? Question may be simple. But it match harder then for(i <- 1 until 10) {} examples in documentation.
for (int i = password.length(); i != 0; i >>>=1)
{ some code }
King regards, Alexey
Upvotes: 4
Views: 628
Reputation: 62835
If you seek for exotic functional way you can write something like this:
Stream.iterate(password.length)(i => i >>> 1).takeWhile(0!=)
It lazily performs the following actions: takes password length as initial value, applies { => i >>> 1 }
to it, passes it to the next iteration, applies ... passes, ...
Then I've scoped computation, limiting it to only thoose values that are not equals to 0.
Upvotes: 2
Reputation: 479
didnt know the >>>= operator. Let's try to be a little more functional, foreach takes a function A => Unit, in this case A is Int
def breakdownBy2(from:Int):List[Int] = if(from == 0) Nil else List(from) ++ breakdownBy2(from/2)
breakdownBy2(passoword.length).foreach(println(_))
Upvotes: 0
Reputation: 167891
If you want it to be as fast as possible--which I am assuming is the case given the shift operation--then you should use a while loop:
var i = password.length()
while (i != 0) {
// some code
i >>>= 1
}
It's one of the few cases where Java is more compact than Scala given the same operation.
You could also use tail recursion:
final def passwordStuff(password: Password)(i: Int = password.length): Whatever = {
if (i != 0) {
// Some code
passwordStuff(password)(i >>> 1)
}
}
which will compile into something of the same speed as the while loop (in almost every case, anyway).
Upvotes: 6
Reputation: 23465
i >>>=
1 is equivalent to i /= 2
for positive integers.
Combining this knowledge with the answers to Incrementing the for loop (loop variable) in scala by power of 5 you should be set.
Upvotes: 1