检查地图上的某个键是否有值的惯用方法是什么?例如,如果我们有:
=> (def seq-of-maps [{:foo 1 :bar "hi"} {:foo 0 :bar "baz"}])
Run Code Online (Sandbox Code Playgroud)
要查找所有地图:foo == 0,我喜欢:
=> (filter (comp zero? :foo) seq-of-maps)
({:foo 0, :bar "baz"})
Run Code Online (Sandbox Code Playgroud)
但如果我想找到所有的地图:bar =="hi",我能想到的最好的是:
=> (filter #(= (:bar %) "hi") seq-of-maps)
({:foo 1, :bar "hi"})
Run Code Online (Sandbox Code Playgroud)
我发现它不太可读.这样做有更好/更惯用的方式吗?
假设我从外部世界收到一些输入,我有以下架构:
(def my-schema
{(s/optional-key :foo) Bool
(s/optional-key :baz) Bool
(s/optional-key :bar) Bool})
Run Code Online (Sandbox Code Playgroud)
有了上述内容,我正在验证的地图中可能存在或缺少所有键或没有键,这是有道理的.但是,如果我想确保其中至少有一个存在,该怎么办?
在Schema验证了上述内容后,我当然可以执行额外的单独检查,并确保密钥计数> = 1,但我很好奇是否有一种方法可以在Schema定义中强制执行.
思考?
给定Clojure中的set,map和vector实现IPersistentCollection和IFn,Clojure如何决定使用SayHi的哪个实现:
(defprotocol SayHi
(hi [this]))
(extend-protocol SayHi
clojure.lang.IPersistentCollection
(hi [_] (println "Hi from collection"))
clojure.lang.IFn
(hi [_] (println "Hi from Fn!"))
clojure.lang.IPersistentSet
(hi [_] (println "Hi from set!")))
(hi #{})
Hi from set!
(hi [])
Hi from collection
Run Code Online (Sandbox Code Playgroud) 我正在解析一个大的csv文件,我使用它的第一行作为记录的键.所以对于像以下的csv文件:
header1,header2
foo,bar
zoo,zip
Run Code Online (Sandbox Code Playgroud)
我最终得到了一个懒惰的seq:
({:header1 "foo" :header2 "bar"},
{:header1 "zoo" :header2 "zip"})
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但我不确定在以下函数中我是否持有"行"的头部.
(defn csv-as-seq [file]
(let [rdr (clojure.java.io/reader file)]
(let [lines (line-seq rdr)
headers (parse-headers (first lines))]
(map (row-mapper headers) (rest lines)))))
Run Code Online (Sandbox Code Playgroud)
有人可以澄清一下吗?