Much like forEach(), both fold() and reduce() are terminating functions. But instead of terminating with Unit, which is not useful, they terminate with a single value of the same type.
The most common example of reduce is, of course, for adding up stuff. With the list of people from the previous example, we can do the following:
println(people.reduce {p1, p2 ->
Person("Combined", "Age", p1.age + p2.age)
})
The output of the preceding code will be as follows:
Person(firstName=Combined, lastName=Age, age=64)
Well, combining a lot of people into one doesn't make much sense, unless you're a fan of some horror movies.
But with reduce, we can also compute who's the oldest or the youngest in the list:
println(people.reduce {p1, p2 ->
if (p1.age > p2.age) { p1 } else { p2 }
})
The second function we're about to...