在clojure中接受并接受

时间:2014-11-17 09:25:18

标签: clojure rabbitmq take

我正在尝试从队列中获取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条消息。

有更好的背叛方式吗?

1 个答案:

答案 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"))))