Я работаю в clojure с классом java, который предоставляет API поиска для двоичного файла, специфичного для домена, содержащего серию записей.
Класс java инициализируется файлом, а затем предоставляет метод .query
, который возвращает экземпляр внутреннего класса, который имеет только один метод .next
, что не очень хорошо сочетается с обычным API коллекций java. Ни внешний, ни внутренний класс не реализуют никакого интерфейса.
Метод .query
может возвращать null вместо внутреннего класса. Метод .next
возвращает строку записи или null, если больше записей не найдено, он может вернуть null сразу после первого вызова.
Как заставить этот java API хорошо работать из clojure без написания дополнительных классов java?
Лучшее, что я смог придумать, это:
(defn get-records
[file query-params]
(let [tr (JavaCustomFileReader. file)]
(if-let [inner-iter (.query tr query-params)] ;.query may return null
(loop [it inner-iter
results []]
(if-let [record (.next it)]
(recur it (conj results record))
results))
[])))
Это дает мне вектор результатов для работы с абстракциями clojure seq. Существуют ли другие способы предоставления последовательности из java API, либо с помощью ленивой последовательности -, либо с использованием протоколов?