为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2023-11-01 22:19:34
(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。
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

做与在 java 中做的同样的事情。对其调用互操作方法,例如(.map stream ...)或其他任何方法,然后将其收集到最后的列表中,或减少它,或任何您需要执行的操作。

Clojure 函数不实现流所需的接口,例如 java.util.function.Function,因此您需要使用 reify 而不是简单的fn

(.map stream (reify java.util.function.Function (apply [this x] (foo x))))


查看完整回答
反对 回复 2023-11-01
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

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



查看完整回答
反对 回复 2023-11-01
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

我想迭代流 Java/命令式风格以避免堆爆。我不需要减少流,我需要处理每一行并取出一个字段并将其发送出去。我认为为此我可能最好使用doseq。

(doseq 
  [l (iterator-seq (.iterator stream))] 
    (println l))


查看完整回答
反对 回复 2023-11-01
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信