考虑以下Scala中的布尔值列表
List(true, false, false, true)
您如何使用foldRight或foldLeft模拟对列表中的所有值执行逻辑AND的功能?
答案 0 :(得分:50)
您可以使用foldLeft/Right
作为逻辑AND,或forall(identity)
作为逻辑OR,而不是exists(identity)
。
编辑:这些功能的好处是提前退出。如果forall
点击false
或exists
一个true
,他们会立即返回。
答案 1 :(得分:11)
val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)
答案 2 :(得分:4)
我最喜欢forAll
方法,只要它适合您的用例。它很早就退出了。但是,如果这不适合另一个,只是稍微复杂一点的方法。
使用reduceOption,您不会提前退出,但您可以清楚地指定列表为空的情况的值。
val l = List(true, false, false, true)
val andAll = l.reduceOption(_ && _).getOrElse(false)
答案 3 :(得分:3)
没有初始值,如foldLeft
,
List(true, false, false, true).reduce(_&&_)
然而,这不适用于List.empty[Boolean]
。