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

17

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

, например:

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

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

    
задан szymanowski 04.12.2013 в 16:26
источник

2 ответа

31

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

some

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

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

filter + first

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

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

remove + first

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

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

Или с some :

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

Так вот, я думаю.

    
ответ дан xsc 04.12.2013 в 16:38
источник
8

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

user=> (->> (range) (filter #(> % 10)) first)
11
user=> (first (filter #(> % 10) (range)))
11
    
ответ дан edbond 04.12.2013 в 16:38
источник