在Scala中考虑以下布尔值列表。
List(true, false, false, true)
你如何使用foldRight或foldLeft来模拟对列表中所有值执行逻辑AND函数的功能?
List(true, false, false, true)
你如何使用foldRight或foldLeft来模拟对列表中所有值执行逻辑AND函数的功能?
除了使用 foldLeft/Right
,你也可以使用 forall(identity)
来表示逻辑与,或者使用 exists(identity)
来表示逻辑或。
编辑:这些函数的好处在于可以提前退出。如果 forall
遇到 false
或者 exists
遇到 true
,它们会立即返回。
true
: List.empty[Boolean].forall(identity) == true
和 List.empty[Boolean].exists(identity) == false
。 - Randall Schulz&&
或 ||
进行折叠会得到相同的结果。 - drexinval l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)
foldLeft
没有初始值。
List(true, false, false, true).reduce(_&&_)
然而,这对于List.empty[Boolean]
不起作用。
只要符合你的使用情况,我最喜欢的方法是使用forAll
。它能够提前退出,非常方便。但是如果这个方法不适用,还有另一种稍微复杂一些的方法。
使用reduceOption方法,你不能提前退出,但是你可以清楚地指定列表为空时的返回值。
val l = List(true, false, false, true)
val andAll = l.reduceOption(_ && _).getOrElse(false)
OP明确要求使用foldRight
或foldLeft
来解决问题,所以被接受的答案是严格正确的。当前得票最多的答案-使用forall
-由于具有提前退出的优势而具有更好的性能。这里有另一种解决方案-使用contains
-同样具有提前退出,并且可能更易读。
对于逻辑与:
!List(true, false, false, true).contains(false)
对于逻辑 OR,它甚至更简单,不需要否定:
List(true, false, false, true).contains(true)
!List.empty[Boolean].contains(false)
// Returns true
Some(List.empty[Boolean]).filter(_.nonEmpty).exists(!_.contains(false))
// Returns false