该代码仅用于说明目的,即它是示例而非实际代码。
我试过了:
val results = for(i <- 1 to 20)
{
val x = i+1
println(x)
yield x
}
和这个
val results = for {i <- 1 to 20;
val x = i+1;
println(x)
}
yield x
但这一切都不起作用 - 我需要一个生成器,定义和一个声明 - 这可以用yield来实现吗?如果是,那么正确的语法是什么?
答案 0 :(得分:8)
希望这会让你开始:
val result = for (i <- 1 to 10 if i%2==0) yield {
println(i);
i
}
相当于
(1 to 10).filter(_%2==0).map(x => { println(x); x } )
答案 1 :(得分:3)
您似乎认为Scala中的for
与命令式语言中的for
类似。不是!在幕后,它使用flatMap
。 for/yield
语法的第一部分中的每个表达式都必须具有某种形式。如果我没有弄错的话,它必须是一个赋值(限于val
,可能)或<-
表达式。你可以破解它以获得你想要的东西:
for {
i <- 1 to 20
val x = i + 1
_ <- {println(x); List(1)}
} yield x
但这太可怕了。正如贾米尔所证明的那样,攻击yield
也是一种可能性,但也非常可怕。
问题是,你究竟想要完成什么? foreach
最适用于副作用循环代码:
(1 to 10) foreach { i =>
val x = i+1
println(x)
}
map
最适合用于生成相同长度的新列表:
(1 to 10) map (i => i + 1)
想要同时做两件事是相当不寻常的,有点难看。