Выберите первый элемент коллекции, который удовлетворяет заданному предикату в clojure

Есть ли функция в clojure, которая (с учетом предиката и коллекции), выбирает первый элемент, который удовлетворяет заданному предикату и останавливает итерацию?

например:

(select-first #(> % 10) (range))
=> 11

Если нет, может быть, кто-то может намекнуть мне на идиоматическую реализацию

Ответы

Ответ 1

Существует несколько возможностей.

some

some возвращает первое значение не-nil, которое возвращает его предикат.

(some #(when (> % 10) %) (range)) ;; => 11

filter + first

filter сохраняет те элементы, которые соответствуют предикату, first извлекает первый из них.

(first (filter #(> % 10) (range))) ;; => 11

remove + first

Если вы хотите найти первый элемент, который не соответствует вашему предикату, remove - ваш друг:

(first (remove #(<= % 10) (range))) ;; => 11

Или с помощью some:

(some #(when-not (<= % 10) %) (range)) ;; => 11

Итак, это, я думаю.

Ответ 2

Использовать фильтр и сначала

user=> (->> (range) (filter #(> % 10)) first)
11
user=> (first (filter #(> % 10) (range)))
11