我有一个Scala循环:
for {
players <- Players.getAll(p => p.age > 4)
salaries <- Salaries.getAll(s => s.amount > 30000)
}yield {
/*other stuff to do*/
....
}
发生的事情只是其中一名球员或薪水是空的?其他东西的代码会被执行吗?循环会不会被执行?
怎么了
我重新格式化您的代码以使其更清晰:
val pIn = Players.getAll(p => p.age > 4)
val sIn = Salaries.getAll(s => s.amount > 30000)
for {
players <- pIn
salaries <- sIn
}yield {
/*other stuff to do*/
....
}
它翻译成
pIn.flatMap(players => sIn.flatMap(salaries => { /*other stuff to do*/...}))
我们知道
flatMap
工作应用一个函数,该函数返回列表中每个元素的序列,并将结果展平为原始列表。
没有列表元素 - 没有应用功能。这意味着/*other stuff to do*/
代码不会在pIn
或sIn
为空的情况下运行
注意pIn
或sIn
是空的。这个很重要。如果players
或salaries
是空的那么/*other stuff to do*/
将起作用。
这不起作用:
val pIn = List.empty
val sIn = List(1,2,3)
这将有效:
val pIn = List(List.empty)
val sIn = List(1,2,3)