如何将类似java Iterator的对象转换为clojure序列

lac*_*oka 13 java sesame clojure seq

我正在使用Sesame库在内存中的三重存储上运行SPARQL查询.

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

查询结果是一个类似自定义Iterator的[1]对象,因此clojure seq不能在开箱即用的情况下工作.

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

我想到的最明显和最愚蠢的想法是循环它并建立一个clojure向量,但我确信有更优雅的方法来解决这个问题.

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

lac*_*oka 10

测试版本:

(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)))))))
Run Code Online (Sandbox Code Playgroud)

  • 这(改进Iterable而不是Iterator)是一种方法; 另一个是重新启用Iterator,然后用[`iterator-seq`](http://clojuredocs.org/clojure_core/clojure.core/iterator-seq)包装它. (3认同)

Chr*_*erg 7

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

(defn iteration-seq [iteration]
  (iterator-seq
   (reify java.util.Iterator
     (hasNext [this] (.hasNext iteration))
     (next [this] (.next iteration))
     (remove [this] (.remove iteration)))))
Run Code Online (Sandbox Code Playgroud)

据我所知,Iteration接口通过标准Iterator接口的唯一优势(如果你想称之为)是它允许声明已检查的异常,这些异常不会在Clojure中使用.

[更新:更正使用的代码,iterator-seq而不是seq@amalloy在另一个答案的评论中所建议的.]