Я предпочитаю просто возвращать пустой указатель и полагаться на вызывающую сторону для обработки его соответственно. (Из-за отсутствия лучшего слова) исключение - то, если я 'абсолютно уверен', что этот метод возвратит объект. В этом случае отказ является исключительным, должен и должен бросить.
Предположим, у вас есть что-то вот так:
(def Person {:name "Bob" } )
(def Person2 {:name "Eric" } )
(def Person3 {:name "Tim" } )
(def mylist (list Person Person2 Person3))
Это сработает:
(filter #(not= "Eric" (get % :name)) mylist)
Для этого лучше использовать функцию «удалить». Он берет последовательность и удаляет элементы, для которых его предикат возвращает «истина». По сути, это противоположность фильтра. Вот пример этого и использования фильтра для тех же целей, которые я разработал с помощью REPL.
user> (def m1 {:name "eric" :age 32}) #'user/m1 user> (def m2 {:name "Rayne" :age 15}) #'user/m2 user> (def m3 {:name "connie" :age 44}) #'user/m3 user> (def mylist (list m1 m2 m3)) #'user/mylist user> (filter #(not= (:name %) "eric") mylist) ({:name "eric", :age 32}) user> (remove #(= (:name %) "eric") mylist) ({:name "Rayne", :age 15} {:name "connie", :age 44})
Как видите, remove немного чище, потому что вам не нужно использовать not =. Кроме того, при работе с картами вам не нужно использовать функцию get, если вы не хотите, чтобы она возвращала что-то особенное, если ключа нет на карте. Если вы знаете, что ключ, который вы ищете, будет на карте, нет причин использовать «get». Удачи!