私は一連のレコードを保持するドメイン固有のバイナリファイルの検索APIを提供するjavaクラスを使用してclojureで作業しています。clojureから非標準的な反復的なJava APIを使用したInterop
Javaクラスはファイルで初期化され、.next
というメソッドを1つしか持たない内部クラスのインスタンスを返す.query
メソッドを提供します。したがって、通常の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の配列の抽象化で動作するように、結果のベクトルを与えます。 lazy-seqまたはプロトコルを使用してJava APIからseqを公開する方法はありますか?
これは興味深い質問ですが、非標準Java APIとはどういう意味ですか? – octopusgrabbus
@octopusgrabbus具体的には、Javaコードがjava.util.Iteratorを提供せず、java.lang.Iterableも実装していないことを意味します。論理的には、Javaコードは反復を提供していますが、そのための標準APIへの接続はありません。 –