ich würde empfehlen, dies zu tun reduzieren mit wie folgt:
(defn count-truthy [coll]
(reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
Gründe für die auf diese Weise reduzieren mit:
- Es ist wahrscheinlich, effizienter zu sein, und wird von Clojure des neuen Reduzierungen Funktionalität profitieren, die Tatsache auf
viele Sammlungen reduziert ermöglicht
- Es vermeidet eine Zwischensequenz zu schaffen (das, wenn Sie eine faule Sequenzfunktion wie Filter verwendet passieren würde,)
Wenn Sie bereits eine realisierte Sequenz haben, dann ist die folgende ist auch eine gute Option, da sie von primitiver Arithmetik in der Schleife profitieren:
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
keine duplizieren - Werte gegen die Rückgabe zu zählen ist eine andere Operation (und hat einige ganz unterschiedliche Lösungen) – mikera