Применение логического и списка логических значений
Рассмотрим следующий список булевых значений в 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)