过滤掉clojure中无法解析为数字的向量元素

时间:2015-07-09 12:13:30

标签: clojure

在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块?

2 个答案:

答案 0 :(得分:4)

您可以使用正则表达式首先过滤有效输入:

(->> v
     (filter (partial re-matches #"\d"))
     (map read-string))

使用Integer/parseInt

(->> v
     (filter (partial re-matches #"\d"))
     (map #(Integer/parseInt %)))

使用单for循环代替filtermap高阶函数:

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

如果您还想解析,请在此处进行映射。