Map is a function that takes two parameters. A list and another function that will be executed for every element in the list:
(defn multiply-by-2[x] (* x 2)) (map multiply-by-2 [0 1 2 3 4 5 6 7 8 9]) ; => (0 2 4 6 8 10 12 14 16 18)
The map funktion is a wonderful thing, because every computation for a list element can be parallelized.
Even though Clojure has the function pmap that does exactly this parallelization, I built the same functionality on my own to understand multithreading with Clojure and java.util.concurrent.
Here it is:(import '(java.util.concurrent Executors)) (defn my-pmap [map-fn, l] (let [len (count l) pool (Executors/newFixedThreadPool len) tasks (map (fn [i](fn [] (map-fn (nth l i)))) (range len))] (let [result (map (fn [future](.get future)) (.invokeAll pool tasks))] (.shutdown pool) result))) (my-pmap multiply-by-2 [0 1 2 3 4 5 6 7 8 9]) ; => (0 2 4 6 8 10 12 14 16 18) ; it yields the same result as (pmap multiply-by-2 [0 1 2 3 4 5 6 7 8 9])