如何在 Clojure 中使用 java.util.stream.Stream?

(import java.nio.file.Files)

(import java.nio.file.Paths)

(import java.util.stream.Stream)


(def path 

  (Paths/get "." 

    (into-array ["data" "10000000.test.log"])))


(def stream 

  (Files/lines path))

这样我就有了:


stream

#object[java.util.stream.ReferencePipeline$Head 0x50129b8f

"java.util.stream.ReferencePipeline$Head@50129b8f"]

有没有办法在不耗尽内存的情况下迭代它?对SO的建议并没有多大帮助。文件大约1G。


ITMISS
浏览 141回答 2
2回答

浮云间

做与在 java 中做的同样的事情。对其调用互操作方法,例如(.map stream ...)或其他任何方法,然后将其收集到最后的列表中,或减少它,或任何您需要执行的操作。Clojure 函数不实现流所需的接口,例如 java.util.function.Function,因此您需要使用 reify 而不是简单的fn:(.map stream (reify java.util.function.Function (apply [this x] (foo x))))

拉丁的传说

您可能需要研究一个名为ike.cljj 的库来了解一些互操作细节。

梵蒂冈之花

我想迭代流 Java/命令式风格以避免堆爆。我不需要减少流,我需要处理每一行并取出一个字段并将其发送出去。我认为为此我可能最好使用doseq。(doseq    [l (iterator-seq (.iterator stream))]      (println l))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java