Итак, вам нужен метод exists
(l.exists(test)
), который ничего не говорит о том, как вы бы реализовали его. Самая простая реализация не очень эффективна:
def f(l: List[Int]): Boolean = l.foldLeft(false)((flag, n) => flag || test(n))
Проблема в том, что он будет проходить через все l
, даже если тестирование остановится, когда flag
станет истинным. Теперь большинство функциональных методов итерации (на строгих языках) не прекратят итерацию, пока не завершат всю коллекцию. Те, которые действительно реализованы, в значительной степени реализованы так же, как и вы, так что, в конце концов, вы просто скрываете код такого рода, а не избегаете его.
Однако, если бы мне потребовалось использовать существующие методы и, конечно же, не использовать exists
, и, кроме того, быть эффективным, можно сделать что-то вроде этого:
def f(l: List[Int]): Boolean = l.dropWhile(!test(_)).nonEmpty