Вы хотите найти первый объект в списке, который соответствует некоторым критериям (проверьте первый элемент объекта), затем Вы хотите сделать что-то к тому объекту (получите его второй элемент).
Clojure cheatsheet рекомендует some
или filter
для поиска seq.
(defn lookup
[x col]
(some (fn [[k v]]
(when (= x k) v))
col))
(defn lookup
[x col]
(->> col
(filter (fn [[k v]]
(when (= x k) v)))
first))
Также хороший вариант. См. ответ amalloy .
, Вы могли бы использовать любой из вышеупомянутых методов, чтобы сделать это.
(defn lookup
[pred f col]
(some (fn [x]
(when (pred x)
(f x)))
col))
(defn lookup
[pred f col]
(first (for [x col :when (pred x)]
(f x))))
;; usage: (lookup (comp '#{b} first) second data)
Во-первых, javax.xml.bind.Validator
устарел в пользу javax.xml.validation.Schema
( javadoc ). Идея заключается в том, что вы анализируете свою схему с помощью javax.xml.validation.SchemaFactory
( javadoc ) и вводите это в маршаллер / демаршаллер.
Что касается вашего вопроса относительно проверка без маршалинга, проблема здесь в том, что JAXB фактически делегирует проверку Xerces (или любому другому процессору SAX, который вы используете), а Xerces проверяет ваш документ как поток событий SAX. Итак, для проверки вам необходимо выполнить некоторый вид маршаллинга.
Самая низкая реализация этого будет использовать реализацию «/ dev / null» процессора SAX. Маршалинг до нулевого OutputStream по-прежнему будет включать создание XML, что является расточительным. Поэтому я предлагаю:
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(locationOfMySchema);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setSchema(schema);
marshaller.marshal(objectToMarshal, new DefaultHandler());
DefaultHandler
отбросит все события, а операция marshal ()
вызовет исключение JAXBException, если проверка схемы не удалась.