Обработка файла плавающих Java как ленивой последовательности Clojure

Что было бы идеоматичным способом в Clojure, чтобы получить ленивую последовательность над файлом, содержащим значения float, сериализованные из Java? (Я играл с подходом with-open, основанным на примерах чтения строк, но, похоже, не могу подключить точки для обработки потока как плавающие.)

Спасибо.

Ответ 1

(defn float-seqs [#^java.io.DataInputStream dis]
  (lazy-seq
    (try
      (cons (.readFloat dis) (float-seqs dis))
      (catch java.io.EOFException e
        (.close dis)))))

(with-open [dis (-> file java.io.FileInputStream. java.io.DataInputStream.)]
  (let [s (float-seqs dis)]
    (doseq [f s]
      (println f))))

Вы не обязаны использовать open-open, если вы уверены, что собираетесь потреблять весь seq.

Если вы используете open-open, дважды проверьте, что вы не просачиваете seq (или производный seq) за пределы своей области.