如何将for-yield循环与if / else构造相结合

时间:2018-09-18 08:21:50

标签: scala

我有一个数组

val d = Array(1,-1,23,-5,7,8,0,-9)

我将所有偶数除以2

val index = for(i <- 0 until d.length if d(i)%2==0) yield d(i) / 2

我将所有奇数加1

val index = for(i <- 0 until d.length if d(i)%2==1) yield d(i) + 1

如何将这两个操作合而为一?

val index = for(i <- 0 until d.length) if(d(i)%2==0) yield d(i) / 2 else yield d(i) + 1

然后我收到语法错误

illegal start of simple expression

3 个答案:

答案 0 :(得分:1)

您不能调用多个收益率。 所以试试这个:

val d = Array(1,-1,23,-5,7,8,0,-9)
val index = for(i <- 0 until d.length) yield (if(d(i)%2==0) d(i) / 2 else d(i) + 1)

答案 1 :(得分:1)

这非常直截了当

for{ value <- d
value2  = if(value ÷2 == 0 ) value/2 else value+1
} yield value2

结果

Array(2,0,24,-4,8,4,0;-8)

答案 2 :(得分:1)

您需要在yield之后使用单个ifyield表达式(如注释中所述)

但是您不需要遍历索引,您可以直接遍历数组:

for (v <- d) yield if (v%2 == 0) v/2 else v + 1

这等效于map呼叫:

d.map(v => if (v%2 == 0) v/2 else v + 1)

您也可以使用collect

d.collect {
  case v if v%2 == 0 =>
    v / 2
  case v =>
    v + 1
}