【发布时间】:2012-07-09 23:17:08
【问题描述】:
我正在 clojure 中使用 java 类,该类为包含一系列记录的域特定二进制文件提供检索 API。
java 类用一个文件初始化,然后提供一个.query 方法,该方法返回一个内部类的实例,该实例只有一个方法.next,因此不能很好地使用通常的java 集合API。外部类和内部类都没有实现任何接口。
.query 方法可能返回 null 而不是内部类。 .next 方法返回一个记录字符串,如果没有找到更多记录,则返回 null,它可能会在第一次调用时立即返回 null。
如何在不编写更多 java 类的情况下使这个 java API 在 clojure 中正常工作?
我能想到的最好的方法是:
(defn get-records
[file query-params]
(let [tr (JavaCustomFileReader. file)]
(if-let [inner-iter (.query tr query-params)] ; .query may return null
(loop [it inner-iter
results []]
(if-let [record (.next it)]
(recur it (conj results record))
results))
[])))
这为我提供了一个与 clojure seq 抽象一起使用的结果向量。是否有其他方法可以从 java API 公开序列,无论是使用惰性序列还是使用协议?
【问题讨论】:
-
这是一个有趣的问题,但非标准 Java API 是什么意思?
-
@octopusgrabbus 特别是我的意思是Java代码不提供 java.util.Iterator 也不实现 java.lang.Iterable 。从逻辑上讲,java 代码提供了迭代,但没有与标准 API 的连接。
标签: clojure iteration seq clojure-java-interop