如何在scala中只执行外部for循环?

时间:2017-09-01 00:21:55

标签: scala for-loop

在Scala中,如果我有一个嵌套的for循环,我想在每个循环上执行不同的操作。

for (int i = 0; i<5; i++) {
   System.out.println(i);       //do something for just i
   for(int j = 0; j<5; j++) {
      System.out.println(i+j);  //do something for both i and j
   }
}

但是scala代码:

for {i<-0  to 5 
     j<- 0 to 5} yield { print(i); print(i+j)} 

给出输出:

    0
(0,0)
0
(0,1)
0
(0,2)
0
(0,3)
0
(0,4)
0
(0,5)

但我希望它是:

0
(0,0)
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)

是否有办法只针对每个i打印i,并为 ONE i+j和i打印j > for loop?

3 个答案:

答案 0 :(得分:3)

编译器将for理解重写为其成分map()flatMap()foreach()withFilter()部分。这就是为什么Scala语法的一些常规规则不适用于序列理解表达式的原因。他们在重写过程中受到了损害。

有一些技巧可以解决这个问题。

for {
  i <- 0 to 5
  _ = println(i)
  j <- 0 to 5
} yield // do stuff with i and j

这实际上取决于您需要对i值执行的操作。可能for理解不是这项工作的最佳工具。

答案 1 :(得分:1)

我认为这会解决问题:

(0 to 5).zip(0 to 5).foreach{case (i, j) => 
    //do stuff to i an dj
}

答案 2 :(得分:1)

执行相同操作的另一种方法是使用map函数,如下所示

val loop = 0 to 5
loop.map(i => {
  println(i) // do your stuffs as you did for i
  loop.map(j => {
    println(i, j) //do your stuffs as you did for i, j 
  })
})