如何在Clojure中将类转换为对象?附示例说明
在Clojure中将类/Record实例转换为普通Map
嘿,这个需求在Clojure开发里挺常见的——尤其是当你需要把自定义的record或者Java类实例转换成通用的map结构时。针对你给出的#app.DatabaseEvent实例,我给你分享几个简单靠谱的方法:
方法1:用into直接转换(最通用)
如果你的目标实例是Clojure的record(通过defrecord定义的类型,就像例子里的DatabaseEvent),它本身已经实现了IPersistentMap接口,用into把它转进空map就能得到普通的map结构:
; 假设你的record实例是event (def event #app.DatabaseEvent{:token #uuid "58262681-400c-43a7-96d3-93c9b8a8ab11", :timestamp #inst "2018-03-27T12:02:07.558000000-00:00", :message "hello world!", :state "info"}) ; 转换操作 (into {} event)
执行后你会得到完全符合预期的结果:
{:token #uuid "58262681-400c-43a7-96d3-93c9b8a8ab11", :timestamp #inst "2018-03-27T12:02:07.558000000-00:00", :message "hello world!", :state "info"}
这个方法的好处是通用,不管是record还是其他实现了Map接口的类实例,都能直接用。
方法2:针对Java类实例的bean函数
如果你的目标是Java类的实例(不是Clojure record),可以用Clojure内置的bean函数——它会自动识别JavaBean风格的getter方法,把属性转换成Clojure map的键:
; 假设你有一个Java类实例java-event (def java-event (new app.DatabaseEvent #uuid "58262681-400c-43a7-96d3-93c9b8a8ab11" #inst "2018-03-27T12:02:07.558000000-00:00" "hello world!" "info")) ; 转换操作 (bean java-event)
这个方法会把Java类的getToken()、getTimestamp()等方法对应的属性,转换成:token、:timestamp这样的键,生成你需要的map结构。
方法3:提取指定键(按需转换)
如果你不需要所有字段,只想提取部分键,可以用select-keys,精准获取你需要的内容:
(select-keys event [:token :message]) ; 结果:{:token #uuid "58262681-400c-43a7-96d3-93c9b8a8ab11", :message "hello world!"}
内容的提问来源于stack exchange,提问作者Freid001
相关产品推荐
相关产品推荐

