【问题标题】:what happens if looping within several list but one is empty in Scala for如果在多个列表中循环但在 Scala for 中一个为空,会发生什么情况
【发布时间】:2019-03-13 16:49:47
【问题描述】:

我有一个像这样的 Scala 循环:

for {
         players <- Players.getAll(p => p.age > 4)
         salaries <- Salaries.getAll(s => s.amount > 30000)
    }yield {
           /*other stuff to do*/
            ....      
    }

玩家薪水中只有一个是空的会发生什么? other things to do处的代码会被执行吗?循环不会被执行吗?

发生了什么

【问题讨论】:

  • 不,因为理解是顺序的,如果任何集合为空,则永远不会执行 yield 块。在您的情况下,for 将返回一个空集合。
  • 那么就像存在和AND在包含的表达式之间
  • 你试过了吗?
  • 是的,我在调试我的代码时遇到了一些问题,有些事情告诉我这正在发生。谢谢

标签: scala playframework


【解决方案1】:

我重新格式化您的代码以更清晰:

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*/代码在pInsIn为空的情况下不会运行

注意 pInsIn 为空。这个很重要。如果playerssalaries 为空,则/*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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2016-02-11
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2019-08-20
    相关资源
    最近更新 更多