嗨,
我正在学习有关变换器的知识,但也遇到了一些困境。
我想了解的是,它们是否适合在我的用例中使用(作为学习练习),以及我所做的是否正确/效率高/或许有更好的方法 :-)
假设我有一个数据结构如下
(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 的一部分,因为关键字不是变换器。
我在如何使这更高效/更好以及如何在学习如何使用变换器之间感到困惑。
我将感激任何帮助/指导/反馈!
谢谢。