如何改进Clojure函数?

如何改进Clojure函数?,clojure,Clojure,我只是基于对该语言的有限知识编写了第一个Clojure函数。我希望得到一些关于性能和类型使用的反馈。例如,我不确定 如果我应该使用列表或向量 (defn actor-ids-for-subject-id [subject-id] (sql/with-connection (System/getenv "DATABASE_URL") (sql/with-query-results results ["SELECT actor_id FROM entries WHERE su

我只是基于对该语言的有限知识编写了第一个Clojure函数。我希望得到一些关于性能和类型使用的反馈。例如,我不确定 如果我应该使用列表或向量

(defn actor-ids-for-subject-id [subject-id]
  (sql/with-connection (System/getenv "DATABASE_URL")
    (sql/with-query-results results
      ["SELECT actor_id FROM entries WHERE subject_id = ?" subject-id]
      (let [res (into [] results)]
        (map (fn [row] (get row :actor_id)) res)))))
它通过以下测试(给定适当的种子数据):


如果它起到了作用(我想是的),我对返回数据的使用特征将几乎完全涉及生成同一函数返回的另一个集合的并集和交集。

结果是一个
clojure.lang.Cons
,是一个惰性序列,通过
clojure.java.jdbc/resultset-seq
返回。每个记录都是一个
映射

(defn actor-ids-for-subject-id [subject-id]
  (sql/with-connection (System/getenv "DATABASE_URL")
    (sql/with-query-results results
      ["SELECT actor_id FROM entries WHERE subject_id = ?" subject-id]
      (into [] (map :actor_id results)))))

当初始向量为空时,使用“vec”而不是“into”更简洁。它可以更清楚地表达意图,尽管这更多是一个偏好问题

(vec (map :actor_id results))

您选择返回向量而不是列表的原因是什么?向量比列表好,不需要引号,推荐它。这主要是文字的参数。对于产生的任何东西来说,这其实并不重要。将某物转换为向量的唯一原因是当您需要向量的特定特征时。在这种情况下,它是预成熟优化。
(vec (map :actor_id results))