Clojure中string/blank?未检测到null,如何正确校验空字符串?
根因分析
首先确认两种常见触发该问题的场景:
- 你使用的Clojure版本较低,旧版本的
clojure.string/blank?不支持入参为nil(即Java null)的场景,入参为null时会直接返回false,不会进入默认值生成分支。 - 你拿到的
coll_id是字符串形式的"null"(比如从接口、数据库、序列化框架返回的字符串化null值),这种全字符的"null"自然不会被string/blank?识别为空。
另外你原代码中还存在变量名不一致的笔误:let块里定义的变量是collVal,但日志打印的是不存在的collSeqVal,需要同步修正。
正确校验方案
根据场景可以选择以下任意一种兼容方案:
方案1:组合判空+空白校验(最通用)
显式兼容nil、空白字符串、字符串"null"的场景:
(defn get-coll-id [^String coll_id] (log/info "coll_id: " coll_id) (if (or (nil? coll_id) (string/blank? coll_id) (= "null" (string/lower-case coll_id))) (let [collVal (get-coll-val)] (log/info "collVal: " collVal) (format "C%011.0f" collVal)) coll_id))
方案2:封装通用校验函数
如果多处需要用到同类校验,可以封装为复用函数:
;; 兼容nil、空白、字符串"null"的通用空校验 (def invalid-coll-id? (some-fn nil? string/blank? #(= "null" (string/lower-case %)))) (defn get-coll-id [^String coll_id] (log/info "coll_id: " coll_id) (if (invalid-coll-id? coll_id) (let [collVal (get-coll-val)] (log/info "collVal: " collVal) (format "C%011.0f" collVal)) coll_id))
方案3:极简写法(无需区分null和空字符串场景)
用str函数先把入参转成字符串,nil调用str会得到空字符串,再做空白校验:
(defn get-coll-id [^String coll_id] (log/info "coll_id: " coll_id) ;; 仅需兼容nil和空白字符串的场景可以用这个写法 (if (string/blank? (str coll_id)) (let [collVal (get-coll-val)] (log/info "collVal: " collVal) (format "C%011.0f" collVal)) coll_id))
内容的提问来源于stack exchange,提问作者CCNA
相关产品推荐
相关产品推荐

