我使用的Java类代表一系列结果(有点像Clojure向量)。
我想将这个类与典型的Clojure序列函数一起使用(即我希望该类的行为就像它支持序列抽象一样)但是我不能改变类所以我无法实现clojure.lang.Seqable
或类似。另外,令人讨厌的是,该课程没有实现java.util.Collection
或java.lang.Iterable
。
我可以看到一些选项:
iterator-seq
。java.util.Collection
/ clojure.lang.Sequable
还有其他选择吗?什么是最好的方法?
答案 0 :(得分:6)
最快,最直接的方法是使用iterator-seq
。
这确实提出了一个问题:为什么核心Clojure不提供像seq
调用的SeqSource这样的协议。然后可以“扩展”非标准集合以提供seq,类似于InternalReduce对reduce
的工作方式。
答案 1 :(得分:6)
Use proxy
扩展课程并使其实施ISeq
答案 2 :(得分:2)
我的第一个镜头是创建该对象的lazy-seq:
(defn sequify [obj]
(letfn [(inner [idx]
(when (< idx (.size obj))
(cons (.get obj idx)
(lazy-seq
(inner (inc idx))))))]
(inner 0)))
只需使用适当的方法替换.size
和.get
即可。
如果要与lazy-seq
解决方案相比提高性能,编写包装器可能更合适。