Pracuję w clojure przy użyciu klasy java, która zapewnia interfejs API pobierania dla pliku binarnego specyficznego dla domeny, przechowującego serię rekordów.Interop z clojure a z niestandardowym iteracyjnym interfejsem API Java
Klasa java jest inicjalizowana za pomocą pliku, a następnie zapewnia metodę .query
, która zwraca instancję klasy wewnętrznej, która ma tylko jedną metodę .next
, a zatem nie jest ładnie odtwarzana za pomocą zwykłego interfejsu API kolekcji Java. Ani klasa zewnętrzna, ani wewnętrzna nie implementuje żadnego interfejsu.
Metoda .query
może zwrócić wartość null zamiast klasy wewnętrznej. Metoda .next
zwraca ciąg rekordów lub wartość null, jeśli nie znaleziono żadnych dalszych rekordów, może zwrócić wartość null natychmiast po pierwszym wywołaniu.
Jak sprawić, aby ten interfejs API języka Java działał dobrze z poziomu aplikacji clojure bez pisania kolejnych klas java?
Najlepszym mogłem wymyślić jest:
(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))
[])))
To daje mi wektor wyników pracy z abstrakcjami clojure nast. Czy są inne sposoby na ujawnienie seqa z API java, czy to z Lazy-Seq czy z użyciem protokołów?
To interesujące pytanie, ale co masz na myśli, mówiąc o niestandardowym interfejsie API języka Java? – octopusgrabbus
@octopusgrabbus konkretnie mam na myśli kod Java nie zapewnia java.util.Iterator ani implementacji java.lang.Iterable. Logicznie kod java zapewnia iterację, ale bez połączenia ze standardowym interfejsem API. –