如何改进这个Clojure函数?

3

我根据自己有限的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)))))

它通过以下测试(提供适当的种子数据):
(deftest test-actor-ids-for-subject-id
  (is (= ["123" "321"] (actor-ids-for-subject-id "123"))))

如果有区别的话(我认为是有区别的),我的数据使用特征几乎全部涉及到生成由同一函数返回的另一个集合的并集和交集。
2个回答

4

在初始向量为空时,使用“vec”而不是“into”略微更加简洁。虽然这更多地是个人偏好问题,但可以更清晰地表达意图。

(vec (map :actor_id results))

2

结果是由clojure.java.jdbc/resultset-seq返回的clojure.lang.Cons,是一个惰性序列。每条记录都是一个map

(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)))))

你选择返回向量而不是列表有什么原因吗? - bloudermilk
向量比列表更好,不需要引号,建议使用。 - number23_cn
1
这主要是针对字面量的论点。对于任何生成的内容,它并不重要。将某些内容转换为向量的唯一原因是当您需要向量的特定特性时。在这种情况下,这是过早的优化。 - kotarak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接