【问题标题】:Can't doseq all entries [duplicate]不能对所有条目进行doseq [重复]
【发布时间】:2018-12-30 21:14:53
【问题描述】:

当我将doseqtransient 映射到java.util.HashMap 时,我总是只能获取8 个条目。 如何获取所有条目?

user=> (def tmp-hash (doto (new java.util.HashMap) (.put "a" 1) (.put "b" 2) (.put "c" 3) (.put "d" 4) (.put "e" 5) (.put "f" 6) (.put "g" 7) (.put "h" 8) (.put "i" 9) (.put "j" 10))
user=> (let [t (transient {})] (doseq [[k v] tmp-hash] (assoc! t k v)) (persistent! t))
{"a" 1, "b" 2, "c" 3, "d" 4, "e" 5, "f" 6, "g" 7, "h" 8}

【问题讨论】:

    标签: clojure


    【解决方案1】:

    问题是,当超过 ArrayMap 的 8 元素阈值时,会创建一个新的 HashMap - is returned 作为 assoc! 的返回值,您将在代码中丢弃它。

    不要在assoc! 之后使用相同的对象引用,您应该使用assoc!use the return value 来使用瞬态结构:

    (persistent! (reduce (fn [acc [k v]]
                           (assoc! acc k v))
                         (transient {}) tmp-hash))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多