scala - 当对其中一项的检查返回 false 时结束 for-comprehension 循环

标签 scala for-comprehension

我对 Scala 有点陌生,所以如果这有点微不足道,我深表歉意。

我有一个我想要迭代的项目列表。我对每个项目执行检查,如果只有一个失败,我希望整个函数返回 false。因此,您可以将其视为 AND 条件。我希望它被懒惰地评估,即当我遇到第一个 false 时返回 false。

我习惯了for - yield过滤通过某个生成器(项目列表、序列等)生成的项目的语法。然而,在我的情况下,我只想突破并返回 false 而不执行循环的其余部分。在普通的 Java 中,人们只会做一个 return false;循环内。

以一种低效的方式(即当我遇到第一个错误项时不停止),我可以这样做:

   (for {
          item <- items
          if !satisfiesCondition(item)
        } yield item).isEmpty

这实质上是说,如果没有项目通过过滤器,则所有项目都满足条件。但这似乎有点复杂且效率低下(假设您有 100 万个项目,而第一个已经不满足条件)。

在 Scala 中执行此操作的最佳和最优雅的方法是什么?

最佳答案

使用 forall 在条件的第一个 false 处提前停止在斯卡拉。 ( A related question )

您的解决方案重写:

items.forall(satisfiesCondition)

演示短路:
List(1,2,3,4,5,6).forall { x => println(x); x < 3 }
1
2
3
res1: Boolean = false

forall相反是 exists一旦满足条件就会停止:
List(1,2,3,4,5,6).exists{ x => println(x); x > 3 }
1
2
3
4
res2: Boolean = true

关于scala - 当对其中一项的检查返回 false 时结束 for-comprehension 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981505/

相关文章:

scala - 用于理解 if 守卫

scala - 用于理解的模式匹配分配如何转化为 monadic 操作?

scala - Scala中的方法参数验证,用于理解和单子(monad)

scala - 为什么与 tuple 类型的提取器一起使用的 for-comprehension 会导致 `filter` 上的编译警告?

使用 for-composition 解决 nQueen 的 Scala 解决方案

scala - 如何仅向特定类型的列表添加额外的行为?

scala - 编解码器组合器 : Header contains magic number that is used to discriminate types

compiler-construction - Scalas/Haskells 解析器组合器是否足够?

Java 还是 Scala 用于新的绿地项目?

java - 将日志字符串解析为可用部分