假设我有一个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循环之外?
答案 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表达式也可能更具合成性。