clojure 字符串空检查失败 string/blank

clojure string null check failed with string/blank

(defn get-coll-id [^String coll_id]
  (log/info "coll_id: " coll_id)
  (if (string/blank? coll_id)
    (let [collVal (get-coll-val)]
      (log/info "collVal: " collSeqVal)
      (format "C%011.0f" collVal))
    coll_id))

日志显示“coll_id: null”。但是,string/blank 没有检测到 null,因此跳过了 collVal 的日志。检查空字符串的方法是什么?

某些东西(也许是数据库?)为您提供 coll_id 的字符串 "null",或者 (log/info ...) 将 Clojure nil 转换为字符串 "null".

考虑这段代码:

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [clojure.string :as str]
  ))

(defn get-coll-id [^String coll_id]
  (println "coll_id: " coll_id)
  (if (str/blank? coll_id)
    (println :blank)
    coll_id))

(dotest
  (newline)
  (println :v1)
  (spyx (get-coll-id nil))

  (newline)
  (println :v2)
  (spyx (get-coll-id (pr-str nil)))
)

输出:

:v1
coll_id:  nil
:blank
(get-coll-id nil) => nil

:v2
coll_id:  nil
(get-coll-id (pr-str nil)) => "nil"

无论您做什么,您都会打印值 nil 或字符串 "nil"

由于我有一段时间没有使用Java,我试图强制它生成字符串"null",但是调用o.toString()得到一个null值创建一个 NullPointerException,所以这不是答案。


更新

正如 amalloy 指出的那样,String.valueOf() 会将 Java null 转换为字符串 "null":

package demo;
public class Demo {
  public static String go() {
    Object o = null;
    return String.valueOf( o );
  }
}

当 运行:

  (newline)
  (spyx :v3 (demo.Demo/go))

结果

:v3 (demo.Demo/go) => "null"

关于你原来的问题,可以使用nil?函数:

(defn blank-or-nil?
  [s]
  (or (nil? s)
    (str/blank? s)))

(defn get-coll-id [^String coll_id]
  (println "coll_id: " coll_id)
  (if (blank-or-nil? coll_id)
    (println "found blank-or-nil coll_id")
    coll_id))

然后在传递 nil 值时打印 found blank-or-nil coll_id。但是,如果您传递的是字符串 "null" 或字符串 "nil".

,这可能会使事情变得混乱

您需要弄清楚输入的是哪个值,然后追查来源。


以上代码是根据我的喜好template project.