嗨,
我在学习转换器的相关知识,但在实践中遇到了一些瓶颈。
我想了解的是,它们是否适用于我的使用场景(以及作为一个学习练习),以及我所做的是否正确/高效/也许有更好的方法 :-)
假设我的数据结构如下
(def trip {:tripData
{:segments [{:dataPoints
[{:location {:lat 1 :lng 2}}
{:location {:lat 3 :lng 4}}]}]}})
可能有一些成百上千的数据点,每个数据点都有一个单独的位置。
我想有效地提取纬度和经度到一个单独的集合,然后将其转换为字符串。我提出了以下方案
(def xf
(comp
(mapcat :dataPoints)
(map :location)
(map (fn [{lat :lat lng :lng}] (str lat " " lng)))))
然后通过以下方式评估
(def lat-lng (into [] xf (->> trip :tripData :segments)))
我得到的结果如下
["1 2" "3 4"]
然后(为了练习的目的),我可以这样做
(clojure.string/join ", " lat-lng)
最终得到这个结果
"1 2, 3 4"
这是完全可以的 :-)
然而,鉴于我对转换器的缺乏经验,我开始思考是否还有其他/更好的方法。例如,在 comp xf 中将数据转换成字符串并在最后连接,而不是使用 clojure.string/join。
我还发现,不使用转换器也可以这样做
(def lat-lng-2 (->> trip
:tripData
:segments
(mapcat :dataPoints)
(map :location)
(map (fn [{lat :lat lng :lng}] (str lat " " lng)))))
这最终通过 clojure.string/join 得到了同样的结果。
然而,我的理解是,你不能使用 map 关键字(例如,:tripData, :segments)作为 comp 的一部分,因为关键字不是转换器。
我困惑如何在提高效率的同时学习如何使用转换器。
我将非常感激任何帮助/指导/反馈!
感谢。