在clojure中考虑以下向量:
(def v ["aaa" "1" "2" "ko" "bla"])
一种方法是:
(defn keep-numbers [v]
(filter number?
(map (fn [itm]
(let [num (try (read-string itm) (catch Exception e nil))] num)
) v)))
这会产生以下结果:
(1 2)
有没有办法做到这一点并摆脱try catch块?
答案 0 :(得分:4)
您可以使用正则表达式首先过滤有效输入:
(->> v
(filter (partial re-matches #"\d"))
(map read-string))
使用Integer/parseInt
:
(->> v
(filter (partial re-matches #"\d"))
(map #(Integer/parseInt %)))
使用单for
循环代替filter
和map
高阶函数:
(for [el v :when (re-matches #"\d" el)]
(Integer/parseInt el))
答案 1 :(得分:0)
一种选择是
(filter (comp number? clojure.edn/read-string) ["aaa" "1" "2" "ko" "bla"])
如果您还想解析,请在此处进行映射。