Применение логического и списка логических значений

Рассмотрим следующий список булевых значений в Scala

List(true, false, false, true)

Как бы вы использовали foldRight или foldLeft, эмулировать функцию выполнения логического И во всех значениях в списке?

Ответ 1

val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)

Ответ 2

Вместо использования foldLeft/Right вы также можете использовать forall(identity) для логического И, или exists(identity) для логического ИЛИ.

edit: Преимуществом этих функций является ранний выход. Если forall попадает на a false или exists a true, они немедленно возвращаются.

Ответ 3

Без начального значения, как в foldLeft,

List(true, false, false, true).reduce(_&&_)

Но это работает не для List.empty[Boolean].

Ответ 4

Мне нравится подход forAll лучше всего, если он подходит для вашего прецедента. Он выходит рано, и это здорово. Однако, если это не подходит здесь, другое, только незначительно более сложное, подход.

С reduceOption вы не получаете раннего выхода, но вы можете четко указать значение для случая, когда список пуст.

val l = List(true, false, false, true)
val andAll = l.reduceOption(_ && _).getOrElse(false)