问题 将Java文件作为惰性Clojure序列处理


在Clojure中,在包含从Java序列化的浮点值的文件中获取延迟序列会是什么? (我玩过一个玩具 with-open 基于行读取示例的方法,但似乎无法连接点以将流作为浮点数处理。)

谢谢。


7180
2018-06-02 20:50


起源

每行一个浮点,或制表符分隔,或空格分隔?你能举一些例子数据吗? - Brian Carper
澄清:该文件由Java浮点数的二进制序列化(即简单类型“float”)组成,它没有被任何东西分隔。我想根据(可能非常大的)文件中的每个条目进行计算 - 想象一下我想将它们全部加起来。即我只想要一个所有值的懒惰序列。 - Cumbayah


答案:


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

如果您确定要使用整个seq,则不需要使用with-open。

如果你使用with-open,请仔细检查你是否没有将seq(或派生的seq)泄露到其范围之外。


15
2018-06-03 07:24



优雅。谢谢。 - Cumbayah
太棒了:它在我的脑海里照亮了懒惰的使用。它终于点击了。 - Peter Tillemans