Ezhik
Ezhik

Reputation: 874

Rewrite 'for' loop from Java to Scala

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

Answers (4)

om-nom-nom
om-nom-nom

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

Yuan Wang
Yuan Wang

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

Rex Kerr
Rex Kerr

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

trutheality
trutheality

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

Related Questions