在 Scala 中循环后如何使对象持久化?

How to make an object persist after a loop in Scala?

假设我有一个 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 循环之外持久化?

您可以从 for comprehension 中产生一个值

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

val z 不是必需的,您可以 return for comprehension 的结果。

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

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

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

为了理解尝试

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 表达式也可能更加综合。