次のScalaのブール値のリストを検討してください。
List(true, false, false, true)
FoldRightまたはfoldLeftを使用して、リスト内のすべての値に対して論理ANDを実行する機能をどのようにエミュレートしますか?
val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)
_foldLeft/Right
_を使用する代わりに、論理ANDの場合はforall(identity)
を、論理ORの場合はexists(identity)
を使用することもできます。
編集:これらの関数の利点は早期終了です。 forall
がfalse
またはexists
true
にヒットすると、すぐに戻ります。
foldLeft
のように初期値がない場合、
List(true, false, false, true).reduce(_&&_)
しかし、これはList.empty[Boolean]
。
ユースケースに適合する限り、forAll
アプローチが最も好きです。それは素晴らしいです。ただし、それがここに収まらない場合は、もう1つ、ほんのわずかに複雑なアプローチです。
ReduceOptionを使用すると、早期終了はありませんが、リストが空の場合の値を明確に指定できます。
val l = List(true, false, false, true)
val andAll = l.reduceOption(_ && _).getOrElse(false)