Clojure函数参数迭代问题:日期解析报错与最旧日期查找需求
解决Clojure可变参数迭代与日期解析问题
先直接点出你遇到的错误根源:
你用& dates定义了可变参数,这会把所有传入的日期字符串打包成一个序列(比如调用时的("09-10-2019" "10-10-2019" "11-10-2019"))。但你在for循环里写了[i [dates]]——这里的[dates]是把整个序列放到了一个只有一个元素的向量里,所以for只会迭代一次,每次拿到的i是整个ArraySeq对象,而不是单个日期字符串,这就导致LocalDate/parse收到了错误的类型,抛出ClassCastException。
第一步:修复日期解析的迭代问题
把for循环的迭代源改成直接的dates,去掉多余的外层包裹:
(defn iterateDates [& dates] (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy")] (for [i dates] ;; 直接迭代dates序列,不用套[] (java.time.LocalDate/parse i ukFormatter))))
现在调用(iterateDates "09-10-2019" "10-10-2019" "11-10-2019")会正确返回解析后的LocalDate序列:
(#object[java.time.LocalDate 0x1a2b3c4d "2019-10-09"] #object[java.time.LocalDate 0x5e6f7g8h "2019-10-10"] #object[java.time.LocalDate 0x9i0j1k2l "2019-10-11"])
第二步:实现“找出最旧日期”的最终目标
因为LocalDate实现了Comparable接口,我们可以直接用apply min从解析后的日期序列里找出最小(最旧)的日期。把函数改写成更贴合目标的版本:
(defn find-oldest-date [& dates] (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy") parsed-dates (for [d dates] (java.time.LocalDate/parse d ukFormatter))] (apply min parsed-dates)))
调用测试:
(find-oldest-date "09-10-2019" "10-10-2019" "11-10-2019") ;; 返回 #object[java.time.LocalDate 0x1a2b3c4d "2019-10-09"]
额外小提示
如果需要处理空参数的情况,可以加个判断避免apply min报错:
(defn find-oldest-date [& dates] (if (empty? dates) nil ;; 也可以抛出自定义异常或返回默认日期 (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy") parsed-dates (for [d dates] (java.time.LocalDate/parse d ukFormatter))] (apply min parsed-dates))))
内容的提问来源于stack exchange,提问作者bluiska
相关产品推荐
相关产品推荐

