使Java类在Clojure中作为序列工作

时间:2012-10-19 01:15:20

标签: java clojure sequence clojure-java-interop

我使用的Java类代表一系列结果(有点像Clojure向量)。

我想将这个类与典型的Clojure序列函数一起使用(即我希望该类的行为就像它支持序列抽象一样)但是我不能改变类所以我无法实现clojure.lang.Seqable或类似。另外,令人讨厌的是,该课程没有实现java.util.Collectionjava.lang.Iterable

我可以看到一些选项:

  • 在对象的(现有)迭代器上使用iterator-seq
  • 将对象包装在另一个实现java.util.Collection / clojure.lang.Sequable
  • 的类中
  • 通过查询Object
  • 创建一个构建Clojure向量或序列的函数

还有其他选择吗?什么是最好的方法?

3 个答案:

答案 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解决方案相比提高性能,编写包装器可能更合适。