Consider the following list of Boolean values in Scala
List(true, false, false, true)
How would you using either foldRight or foldLeft emulate the function of performing a logical AND on all of the values within the list?
Consider the following list of Boolean values in Scala
List(true, false, false, true)
How would you using either foldRight or foldLeft emulate the function of performing a logical AND on all of the values within the list?
val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)
Instead of using foldLeft/Right
, you can also use forall(identity)
for the logical AND, or exists(identity)
for the logical OR.
edit: The benefit of these functions is the early exit. If forall
hits a false
or exists
a true
, they will immediately return.
true
: List.empty[Boolean].forall(identity) == true
and List.empty[Boolean].exists(identity) == false
. –
Karen &&
or ||
. –
Wrote val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)
Without initial value as in foldLeft
,
List(true, false, false, true).reduce(_&&_)
Yet this works not for List.empty[Boolean]
.
I like the forAll
approach best so long as it fits your use case. It exits early which is great. However, if that doesn't fit here's another, only marginally more complex, approach.
With reduceOption you get no early exit, but you can clearly specify the value for the case where the list is empty.
val l = List(true, false, false, true)
val andAll = l.reduceOption(_ && _).getOrElse(false)
The OP specifically asks for a solution using foldRight
or foldLeft
, so the accepted answer is strictly correct. The answer currently with most votes - using forall
- has better performance due to early exit. Here's another solution - using contains
- with early exit too and probably more readable.
For the logical AND:
!List(true, false, false, true).contains(false)
For the logical OR it's even simpler, no negation is needed:
List(true, false, false, true).contains(true)
A note about the "degenerate" empty list case, with logical AND:
!List.empty[Boolean].contains(false)
// Returns true
If that doesn't fit your use case, a marginally more complex solution:
Some(List.empty[Boolean]).filter(_.nonEmpty).exists(!_.contains(false))
// Returns false
© 2022 - 2024 — McMap. All rights reserved.