# Clojure Goodness: Finding The Maximum Or Minimum Value

To find the maximum or minimum value for numeric values we can use the `max`

and `min`

function. The functions accept one or more numeric arguments and the value that is maximum or minimum is returned. If the numbers are already in a sequence we can use `apply max`

or `apply min`

. If the values are not numbers we can use the `max-key`

or `min-key`

functions. These functions take as first argument a function that returns a number. So we can get the value that has the maximum or minimum return value for the function we pass as first argument.

In the next exmaple code we use the `max`

, `min`

, `max-key`

and `min-key`

functions:

```
(ns mrhaki.core.min-max
(:require [clojure.test :refer [is]]))
;; We can use max to find the maximum number in the given arguments.
(is (= 20 (max 10 2 3 1 20)))
;; If we have a collection we can use apply max to find the maximum number.
(is (= 20 (apply max [10 2 3 1 20])))
;; We can use min to find the minimum number in the given arguments.
(is (= 1 (min 10 2 3 1 20)))
;; And also use apply min when we have collection with numbers.
(is (= 1 (apply min [10 2 3 1 20])))
;; When the arguments are not numbers we can provide a function to get
;; back numbers and use that function with max-key to find the maximum.
(is (= "Clojure" (max-key count "Java" "Groovy" "Clojure")))
(is (= "Clojure" (apply max-key count ["Java" "Groovy" "Clojure"])))
;; And to find the minimum for non-numbered arguments we can use min-key
;; with a function to get back numbers.
(is (= "Java" (min-key count "Java" "Groovy" "Clojure")))
(is (= "Java" (apply min-key count ["Java" "Groovy" "Clojure"])))
```

Written with Clojure 1.10.1.