clojure で hbase テーブル スキャンの出力を印刷したいとしましょう。
(defmulti scan (fn [table & args] (map class args)))
(defmethod scan [java.lang.String java.lang.String] [table start-key end-key]
(let [scan (Scan. (Bytes/toBytes start-key) (Bytes/toBytes end-key))]
(let [scanner (.getScanner table scan)]
(doseq [result scanner]
(prn
(Bytes/toString (.getRow result))
(get-to-map result))))))
get-to-map は結果をマップに変換します。次のように実行できます。
(hbase.table/scan table "key000001" "key999999")
しかし、ユーザーがスキャン結果に対して何らかの操作を行えるようにしたい場合はどうすればよいでしょうか? 各結果に適用されるコールバックとして関数を渡すことができるようにすることができました。しかし、私の質問は次のとおりです。ユーザーが各結果を遅延して反復できるようにしたい場合、何を返しますか
(Bytes/toString (.getRow result))
(get-to-map result)
また、lazy-seq を使用した単純化された実装で発生する可能性があるように、以前の結果を保持しません。