私は、一連のレコードを保持するドメイン固有のバイナリ ファイルの取得 API を提供する Java クラスを使用して、clojure で作業しています。
Java クラスはファイルで初期化され、.query
メソッドを 1 つしか持たない内部クラスのインスタンスを返すメソッドを提供する.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 抽象化を操作するための結果のベクトルが得られます。lazy-seqまたはプロトコルを使用して、Java APIからseqを公開する他の方法はありますか?