神刀安全网

Clojure-Fu with Juxt

I love juxt . But I was reminded yesterday that not everyone has made friends with it. So, to give it a little of the limelight it deserves, I thought I’d write down My Favourite Juxt Trick.

The Recap

First, let’s recap what juxt does: it lets you pass the same arguments to several functions in a row. So if you want to find out a person’s name & height, you can do this:

(def name-and-height   (juxt :name :height))

name-and-height is now a single function that returns both results as in a vector:

(def person {:name "Kris"              :height 172              :devastating-handsomeness-factor 2})  (println  (name-and-height person))
[Kris 172]

Nothing special there. It’s just calling each function, :name and :height , with the same arguments, and gathering up the results.

The Trick

Now let’s do something cool with it. I’ve got a list of people working in different departments:

(def people [{:name "Brad"     :salary 27000 :department "hats"}              {:name "Janet"    :salary 54000 :department "capes"}              {:name "Eddie"    :salary 19500 :department "hats"}              {:name "Frank"    :salary 98000 :department "capes"}              {:name "Rocky"    :salary 18000 :department "shoes"}])

I’d like to roll those up by department and largesse. First let’s define what counts as highly-paid, using a number that’s entirely fictional in London:

(defn highly-paid? [x]   (< 30000 (:salary x)))

Now we have two functions, and we can group by both of them:

(pprint  (group-by (juxt :department highly-paid?)            people))
{["hats" false]  [{:name "Brad", :salary 27000, :department "hats"}   {:name "Eddie", :salary 19500, :department "hats"}],  ["capes" true]  [{:name "Janet", :salary 54000, :department "capes"}   {:name "Frank", :salary 98000, :department "capes"}],  ["shoes" false] [{:name "Rocky", :salary 18000, :department "shoes"}]}

There – we’ve just built an on-the-fly, composite-key index of our data, for free.

Any time you need to filter some data by multiple criteria, juxt comes in mighty handy.

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Clojure-Fu with Juxt

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址