Из перечислителя на карте


У меня есть объект почта, который возвращает ее заголовки в качестве перечислителя объектов заголовка, которые имеют два метода getname и думою. Мне нужно конвертировать, что к хорошему в Clojure карты, так что я написал эту небольшую функцию:

(defn extract-headers [message]
  (reduce (fn [hs h] (conj hs {(.getName h) (.getValue h)}))
          {}
          (enumeration-seq (.getAllHeaders message))))

Ничего изменить или поправить?



259
2
задан 3 августа 2011 в 06:08 Источник Поделиться
Комментарии
3 ответа

Можно использовать в, например:

(defn extract-headers [message]
(let [headers (enumeration-seq (.getAllHeaders message))]
(into {} (map #(vector (.getName %1) (.getValue %1)) headers))))

во-первых, с картой вы строите последовательность 2-элемент вектора, который позже преобразуется в карте

3
ответ дан 3 августа 2011 в 11:08 Источник Поделиться

Прочитав другие ответы, просто небольшое улучшение было бы:

(defn extract-headers [message]
(reduce #(conj %1 {(.getName %2) (.getValue %2)})
{}
(enumeration-seq (.getAllHeaders message))))

Только, чтобы сделать его немного короче.

1
ответ дан 3 августа 2011 в 03:08 Источник Поделиться

Мне нравится в подходе, я думаю, что это более идиоматические использовать специальную функцию, чем сокращение, которое является достаточно общим. Однако, я думаю, что с помощью резьбы легче читать на длительный срок.

(defn extract-headers [^Mail message]
(letfn [(project [^Header h] (list (.getName h) (.getValue h)))]
(->>
message
.getAllHeaders
enumeration-seq
(map project)
(into {}))))

Как вы можете видеть, я также включены предложения Алекса в использовании явного FN, которая предотвращает отражение.

1
ответ дан 4 августа 2011 в 09:08 Источник Поделиться