我正在尝试从队列中获取n条消息(使用langohr)。我有一个工作版本,但我想知道是否有一个更好的clojurist方式这样做:
(def not-nil? (complement nil?))
(defn get_message [queue]
(let [[_ payload] (lb/get ch queue)]
(if (not-nil? payload)
(String. payload "UTF-8"))))
(take 4 (take-while not-nil? (repeatedly (partial get_message "my_queue"))))
只要队列中有消息,我就会获取N条消息。
有更好的背叛方式吗?
答案 0 :(得分:4)
not-nil?
与clojure 1.6中的内置函数some?
相同
成语是在Clojure绑定名称中使用-
优先于_
。
(partial get_message "my_queue")
优于#(get-message "my_queue")
,因为您显然无意添加参数
(if (some? payload) (String. payload "UTF-8"))
可以表示为
(some-> payload (String. "UTF-8"))
,
虽然您可能希望保留some->
以进行更长时间的链接,但在这种情况下仍然更简洁。
所以,把这一切放在一起:
(defn get-message [queue]
(let [[_ payload] (lb/get ch queue)]
(some-> payload (String. "UTF-8"))))
(take 4 (take-while some? (repeatedly #(get-message "my_queue"))))