You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure中string/blank?未检测到null,如何正确校验空字符串?

根因分析

首先确认两种常见触发该问题的场景:

  1. 你使用的Clojure版本较低,旧版本的clojure.string/blank?不支持入参为nil(即Java null)的场景,入参为null时会直接返回false,不会进入默认值生成分支。
  2. 你拿到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:18:02