如何将类似java迭代器的对象转换为clojure序列

2022-09-04 19:24:32

我正在使用芝麻库在内存三重存储上运行SPARQL查询。

我正在使用Clojure来实现这一目标。

查询结果是一个自定义的类似迭代器的 [1] 对象,因此 clojure seq 不能开箱即用地处理它。

将自定义java迭代器类对象转换为clojure序列的最优雅方法是什么?

我脑海中浮现的最明显和最愚蠢的想法是循环它并建立一个clojure向量,但我相信有更优雅的方法来解决这个问题。

[1] http://www.openrdf.org/doc/sesame2/api/info/aduna/iteration/Iteration.html


答案 1

测试版本:

(defn iteration->seq [iteration]
 (seq
  (reify java.lang.Iterable 
      (iterator [this] 
         (reify java.util.Iterator
           (hasNext [this] (.hasNext iteration))
           (next [this] (.next iteration))
           (remove [this] (.remove iteration)))))))

答案 2

如何将类似迭代器的对象包装在实际实现接口的对象中?如下所示(未测试):Iterator

(defn iteration-seq [iteration]
  (iterator-seq
   (reify java.util.Iterator
     (hasNext [this] (.hasNext iteration))
     (next [this] (.next iteration))
     (remove [this] (.remove iteration)))))

据我所知,与标准接口相比,该接口的唯一优点(如果你想这样称呼它)是它允许声明已检查的异常,无论如何,这些异常在Clojure中都不会使用。IterationIterator

[更新:更正了要使用的代码,而不是 @amalloy 在另一个答案的注释中建议的代码。iterator-seqseq


推荐