如何在Scala中循环后使对象保持不变?

时间:2015-06-01 14:09:26

标签: scala for-loop persistence

假设我有一个for循环,在每次迭代中创建一个对象并执行某些操作,例如:

def someMethod() {
    for( x <- e) {
      if( x == 1)  val z = 4
      else val z = 5
    }
    z
}

但这不起作用,因为“z”不会超出for循环。如果我想要这样做,我必须这样做:

def someMethod() {
var z = 0
    for( x <- e) {
      if( x == 1) z = 4
      else z = 5
    }
    z
}

但我觉得这不是正确的解决方法。如何使对象(在本例中为z)保持在for循环之外?

4 个答案:

答案 0 :(得分:3)

你可以不再考虑scala中的for循环(因为它不是循环本身,而是for-comprehension)并以功能方式使用scala集合。因此,对于您的任务,您可以编写如下代码:

val x = List(1,2,3,4)
x.find(_ == 1).map(_ => 4).getOrElse(5)

答案 1 :(得分:0)

您可以从for comprehension中获得一个值

def someMethod() {
    val z = for( x <- e) {
        if(x == 1)  yield 4
        else yield 5
    }
    z
}

答案 2 :(得分:0)

val z没有必要,你只需返回for comprehension的结果。

def someMethod() {
    for( x <- e) {
        if(x == 1)  yield 4
        else yield 5
    }
}

答案 3 :(得分:0)

在理解中尝试

for (x <- e; z = if (x == 1) 4 else 5) yield z

其中带有标签z的(不可变)值从if-else表达式获取结果。这为理解产生了一个具有z的值的集合。

从收集转化价值的角度来解决问题,

e.collect {
  case x if (x == 1) => 4
  case _             => 5
}

即使对于两种情况的模式匹配,if-else表达式也可能更具合成性。