我对 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/