2010-06-02 9 views
11

Qu'est-ce qui serait une manière idéomatique dans Clojure d'obtenir une séquence paresseuse sur un fichier contenant des valeurs flottantes sérialisées à partir de Java? (Je ai joué avec une approche with-open basée sur des exemples de lecture de ligne, mais ne peut pas sembler connecter les points pour traiter le flux en tant que flottants.)Traiter un fichier de flottants Java comme une séquence de Clojure paresseuse

Merci.

+0

Un flotteur par ligne, séparé par des languettes ou séparé par des espaces? Pouvez-vous donner des exemples de données? –

+0

Clarification: Le fichier se compose de sérialisations binaires de flottants Java (c'est-à-dire le type simple "float"), il n'est séparé par rien. Je veux faire un calcul basé sur chaque entrée dans le fichier (potentiellement très grand) - imaginez que je veux les résumer tous. C'est à dire. Je veux juste une séquence paresseuse sur toutes les valeurs. – Cumbayah

Répondre

15
(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)))) 

Vous n'êtes pas obligé d'utiliser open-open si vous êtes sûr de consommer le seq entier. Si vous utilisez open-open, vérifiez que vous ne fuyez pas le seq (ou un seq dérivé) en dehors de sa portée.

+0

Élégant. Je vous remercie. – Cumbayah

+0

Génial: il a illuminé l'utilisation de lazy-seq dans mon esprit. Il a finalement cliqué. –