8

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

我想将这个类与典型的 Clojure 序列函数一起使用(即我想让这个类表现得好像它支持序列抽象)但是我不能改变这个类,所以我不能让它实现clojure.lang.Seqable或类似的。此外,令人讨厌的是,该类没有实现java.util.Collectionor java.lang.Iterable

我可以看到几个选项:

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

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

4

3 回答 3

6

最快和最直接的方法是使用iterator-seq.

这确实引出了一个问题:为什么核心 Clojure 不提供像 SeqSource 这样会被seq. 然后可以“扩展”非标准集合以提供 seq,类似于 InternalReduce 的工作方式reduce

于 2012-10-19T03:31:23.547 回答
6

用于proxy扩展类并使其实现ISeq

于 2012-10-19T06:24:41.610 回答
2

我的第一枪是创建该对象的惰性序列:

(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

于 2012-10-19T12:30:08.290 回答